为Python添加编码别名
有没有办法让我在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_linux 和 euc-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 的别名方法也是可以的,当然,这种方法确实更简单;-)。但我怀疑(就像他似乎也觉得的那样)这个方法会更容易维护。