为Python添加编码别名

4 投票
3 回答
3047 浏览
提问于 2025-04-15 12:36

有没有办法让我在Python中为编码设置别名?有些网站使用的编码是'windows-1251',但它们的字符集却设置为'win-1251',所以我想把'win-1251'当作'windows-1251'的别名。

3 个回答

-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/ 这个路径下。

5
>>> import encodings
>>> encodings.aliases.aliases['win_1251'] = 'cp1251'
>>> print '\xcc\xce\xd1K\xc2\xc0'.decode('win-1251')
MOCKBA

虽然我个人觉得这有点像是在修改原有的功能,也就是所谓的“猴子补丁”,我会使用我自己的转换表。不过,我也说不出什么特别有说服力的理由来支持我的看法。:)

8

这个 encodings 模块的文档不太完善,所以我建议使用 codecs 模块,具体可以参考 这里:

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 的别名方法也是可以的,当然,这种方法确实更简单;-)。但我怀疑(就像他似乎也觉得的那样)这个方法会更容易维护。

撰写回答