还有一个编码问题,我正在处理使用 IBM870 编码的 IBM 大型机,python 不支持该编码,或者没有其他任何东西。
幸运的是,一位有天赋的编码人员编写了一个脚本,该脚本使用FileFormat.info上可用的字符列表为 python 生成适当的编码定义
使用的列表是这个:IBM870 字符列表
生成的编码可以在这里看到:cp870.py
有问题的系统是运行 python 2.6 的 RHEL 6.3:
Python 2.6.6 (r266:84292, Aug 28 2012, 10:55:56)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
cp870.py 放置在:
/usr/lib64/python2.6/encodings/
以下条目已添加到:
/usr/lib64/python2.6/encodings/aliases.py
# cp870 codec
'870' : 'cp870',
'csibm870' : 'cp870',
'ibm870' : 'cp870',
别名已正确解析,如此处所示(感谢此答案):
>>> from encodings.aliases import aliases
>>> def find(q):
... return [(k,v) for k, v in aliases.items() if q in k or q in v]
...
>>> find('870')
[('ibm870', 'cp870'), ('870', 'cp870'), ('csibm870', 'cp870')]
>>> find('cp870')
[('ibm870', 'cp870'), ('870', 'cp870'), ('csibm870', 'cp870')]
>>> find('ibm870')
[('ibm870', 'cp870'), ('csibm870', 'cp870')]
当我尝试 encode() 一些字符时,它没有按计划工作:
>>> 'c'.encode('cp870')
'\x83'
>>> 'č'.encode('cp870')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/encodings/cp870.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
这是 '\x83' 根据 cp870.py 应该是什么:
u'\x83' # 0x23 -> NO BREAK HERE (U+0083)
由于我是python的新手,有人可以告诉我还需要什么才能让python正确加载和使用这种编码吗?