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

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

4

1 に答える 1

3

Python 2.x では、ユニコード文字列をプレフィックスuまたはUでマークする必要があります。プレフィックスのない文字列は ASCII (または別の 8 ビット エンコーディング) です。

さらに、python は入力が ASCII エンコードされていることを想定しています (ただし、別のエンコードを構成することもできます)。したがって、非 ASCII 文字を引用符で囲むと、インタープリターはそれを ASCII としてデコードしようとするため、表示されるエラーが発生します。

したがって、uプレフィックスを指定し、エスケープ シーケンスを使用して文字を指定する必要があります。

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