4

还有一个编码问题,我正在处理使用 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正确加载和使用这种编码吗?

4

1 回答 1

3

在 Python 2.x 中,unicode 字符串需要使用前缀uU进行标记。不带前缀的字符串采用 ASCII(或其他 8 位编码)。

此外,python 期望您的输入是 ASCII 编码的(尽管可以配置另一种编码)。因此,当您将非 ASCII 字符放在引号中时,解释器会尝试将其解码为 ASCII,这会导致您看到的错误。

因此,您需要指定u前缀,并使用转义序列来指定字符:

U'\x83'.encode('cp870')
于 2013-02-17T21:12:29.007 回答