0

ヘブライ語テキスト ファイルの Unicode 表現を表示用にヘブライ語に変換するコードがあります。

例えば:

f = open(sys.argv[1])
for line in f:
    print eval('u"' + line +'"')

これは、PyDev (Eclipse) で実行すると楽しく動作しますが、コマンド ラインから実行すると、

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 9-10: ordinal not in range(256)

入力ファイルの行の例は次のとおりです。

\u05d9\u05d5\u05dd

何が問題ですか?どうすればこれを解決できますか?

4

2 に答える 2

4

使用しないでくださいeval()。代わりにunicode_escapeコーデックを使用してそのデータを解釈します。

for line in f:
    line = line.decode('unicode_escape')

unicode_escapeエンコーディングは、Python がソース コードで Unicode リテラルを解析するときと同じ方法で文字シーケンスを解釈し\uabcdます。

>>> '\u05d9\u05d5\u05dd'.decode('unicode_escape')
u'\u05d9\u05d5\u05dd'

ただし、表示される例外はステートメントが原因ではありません。eval()代わりに結果を印刷しようとしたことが原因であると思われます。Python はunicode値を自動的にエンコードしようとし、現在の端末が使用しているエンコードを検出します。

Eclipse 出力ウィンドウは、端末とは異なるエンコーディングを使用します。後者が Latin-1 をサポートするように構成されている場合、Python はヘブライ語のコードポイントをサポートしていないエンコーディングにエンコードしようとするため、その正確な例外が表示されます。

>>> u'\u05d9\u05d5\u05dd'.encode('latin1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)

解決策は、端末を再構成するか (UTF-8 が適切な選択です)、unicodeLatin-1 にエンコードできないコードポイントを含む値を出力しないようにすることです。

Python からの出力をファイルにリダイレクトする場合、Python は出力エンコーディングを自動的に決定できません。その場合、PYTHONIOENCODING環境変数を使用して、標準 I/O に使用するエンコーディングを Python に指示できます。

PYTHONIOENCODING=utf-8 python yourscript.py > outputfile.txt
于 2013-02-02T14:55:08.730 に答える
0

ありがとう、これで私の問題は解決しました。

line.decode('unicode_escape')

トリックをしました。

フォローアップ - これは機能するようになりましたが、出力をファイルに送信しようとすると:

python myScript.py > textfile.txt

ファイル自体にエラーがあります:

'ascii' codec can't encode characters in position 42-44: ordinal not in range(128)
于 2013-02-02T19:28:20.093 に答える