使用しないでください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 が適切な選択です)、unicode
Latin-1 にエンコードできないコードポイントを含む値を出力しないようにすることです。
Python からの出力をファイルにリダイレクトする場合、Python は出力エンコーディングを自動的に決定できません。その場合、PYTHONIOENCODING
環境変数を使用して、標準 I/O に使用するエンコーディングを Python に指示できます。
PYTHONIOENCODING=utf-8 python yourscript.py > outputfile.txt