如何向Python 2.6添加新的编码?

2024-10-01 11:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

还有另一个编码问题,我正在处理一个使用IBM870编码的IBM大型机,python不支持这种编码,也不支持其他编码方式。在

幸运的是,一个有天赋的程序员开发了一个脚本,该脚本使用FileFormat.info上提供的字符列表为python生成适当的编码定义

使用的列表是这个:IBM870 character list

生成的编码可以在这里看到: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放在:

^{pr2}$

以下条目已添加到:

/usr/lib64/python2.6/encodings/aliases.py

# cp870 codec
'870'                : 'cp870',
'csibm870'           : 'cp870',
'ibm870'             : 'cp870',

别名已正确解析,如下所示(thanks to this answer):

>>> 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')]

当我试图编码()一些字符时,它没有按计划工作:

>>> '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)

根据cp870.py,'\x83'应该是:

u'\x83'     #  0x23 -> NO BREAK HERE (U+0083)

由于我是python的新手,有人能告诉我python要正确加载和使用这种编码还需要什么吗?在


Tags: inpy脚本编码列表find字符encode
1条回答
网友
1楼 · 发布于 2024-10-01 11:38:53

在python2.x中,unicode字符串需要用前缀uu来标记。没有前缀的字符串使用ASCII(或其他8位编码)。在

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

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

U'\x83'.encode('cp870')

相关问题 更多 >