【发布时间】:2010-11-07 00:54:06
【问题描述】:
有没有一种方法可以为 python 添加别名进行编码。网上有些网站使用编码“windows-1251”,但它们的字符集设置为 win-1251,所以我想让 win-1251 成为 windows-1251 的别名
【问题讨论】:
标签: python unicode character-encoding
有没有一种方法可以为 python 添加别名进行编码。网上有些网站使用编码“windows-1251”,但它们的字符集设置为 win-1251,所以我想让 win-1251 成为 windows-1251 的别名
【问题讨论】:
标签: python unicode character-encoding
可以通过编辑 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/ 下
【讨论】:
encodings 模块没有很好的文档记录,所以我会改用 codecs,is:
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 的别名方法当然也可以——而且确实比这更简单;-)。但我怀疑(正如他所认为的那样)这个更易于维护。
【讨论】:
>>> import encodings
>>> encodings.aliases.aliases['win_1251'] = 'cp1251'
>>> print '\xcc\xce\xd1K\xc2\xc0'.decode('win-1251')
MOCKBA
虽然我个人会考虑这个猴子补丁,并使用我自己的转换表。但我不能为这个立场提供任何好的论据。 :)
【讨论】:
encodings.aliases.aliases 键是标准化的。这就是decode() 参数中的'win-1251'(带有破折号)如何在内部映射到带有下划线的'win_1251'。反过来是行不通的;带有破折号的人类可读编码名称需要在别名键中用下划线表示。