さらに別のエンコーディングの問題です。私は 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',
ここに示すように、エイリアスは適切に解析されます(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がこのエンコーディングを適切にロードして使用するために他に何が必要かについて誰かが教えてくれますか?