3

Python3.2 を使用していくつかのファイルを読み取ろうとしていますが、一部のファイルには Unicodeが含まれている場合と含まれていない場合があります。

私がしようとすると:

file = open(item_path + item, encoding="utf-8")
for line in file:
    print (repr(line))

エラーが発生します:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(128)

ここのドキュメントに従っています: http://docs.python.org/release/3.0.1/howto/unicode.html

Python がこのコードの任意の時点で ascii にエンコードしようとするのはなぜですか?

4

2 に答える 2

3

問題はrepr(line)、Python 3 では Unicode 文字列も返すことです。上記の 128 文字は ASCII エスケープ シーケンスに変換されません。

ascii(line)エスケープ シーケンスを表示する場合は、代わりに使用します。

実際には、repr(line)は、ソース コードに配置された場合に同じ値を持つオブジェクトを生成する文字列を返すことが期待されています。このように、Python 3 の動作は、ソース ファイルで ASCII エスケープ シーケンスを使用して ASCII 文字を超える文字列を表現する必要がないため、問題ありません。最近では、UTF-8 やその他の Unicode エンコーディングを使用するのはごく自然なことです。真実は、Python 2 がそのような文字のエスケープ シーケンスを生成したということです。

于 2012-04-25T11:49:15.553 に答える
2

あなたの出力エンコーディングは何ですか?への呼び出しを削除するとprint()、機能し始めますか?

UTF-8 以外のロケールを使用していると思われるため、Python はrepr(line)印刷の一部として ASCII としてエンコードしようとしています。

この問題を解決するには、文字列をエンコードしてバイト配列を出力するか、デフォルトのエンコードを文字列を処理できるものに設定する必要があります (UTF-8 が当然の選択です)。

于 2012-04-25T09:32:12.047 に答える