【问题标题】:Adding encoding alias to python向python添加编码别名
【发布时间】:2010-11-07 00:54:06
【问题描述】:

有没有一种方法可以为 python 添加别名进行编码。网上有些网站使用编码“windows-1251”,但它们的字符集设置为 win-1251,所以我想让 win-1251 成为 windows-1251 的别名

【问题讨论】:

    标签: python unicode character-encoding


    【解决方案1】:

    可以通过编辑 aliases.py 文件来添加编码别名。

    # euc_jp codec
    'eucjp'              : 'euc_jp',
    'ujis'               : 'euc_jp',
    'u_jis'              : 'euc_jp',
    'euc_jp_linux'       : 'euc_jp',
    'euc-jp-linux'       : 'euc_jp',
    

    上面我在编码euc_jp中添加了两个别名euc_jp_linuxeuc-jp-linux

    对于 64 位 linux 系统 aliases.py 文件一般位于 /usr/lib64/python2.6/encodings/ 下

    【讨论】:

      【解决方案2】:

      encodings 模块没有很好的文档记录,所以我会改用 codecsis

      import codecs
      
      def encalias(oldname, newname):
        old = codecs.lookup(oldname)
        new = codecs.CodecInfo(old.encode, old.decode, 
                               streamreader=old.streamreader,
                               streamwriter=old.streamwriter,
                               incrementalencoder=old.incrementalencoder,
                               incrementaldecoder=old.incrementaldecoder,
                               name=newname)
        def searcher(aname):
          if aname == newname:
            return new
          else:
            return None
        codecs.register(searcher)
      

      这是 Python 2.6 -- 接口与早期版本不同。

      如果您不介意依赖特定版本的未记录内部结构,@Lennart 的别名方法当然也可以——而且确实比这更简单;-)。但我怀疑(正如他所认为的那样)这个更易于维护。

      【讨论】:

      • 伟大的亚历克斯! --- 不要使用没有很好文档的模块。
      【解决方案3】:
      >>> import encodings
      >>> encodings.aliases.aliases['win_1251'] = 'cp1251'
      >>> print '\xcc\xce\xd1K\xc2\xc0'.decode('win-1251')
      MOCKBA
      

      虽然我个人会考虑这个猴子补丁,并使用我自己的转换表。但我不能为这个立场提供任何好的论据。 :)

      【讨论】:

      • Alex 确实为上述立场提供了一个很好的论据。 :-) 我认为官方的方式工作量太大,仍然会简单地提供我自己的转换列表,但这并不总是可行的
      • 也许指出encodings.aliases.aliases 键是标准化的。这就是decode() 参数中的'win-1251'(带有破折号)如何在内部映射到带有下划线的'win_1251'。反过来是行不通的;带有破折号的人类可读编码名称需要在别名键中用下划线表示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2012-11-07
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 2021-06-02
      相关资源
      最近更新 更多