0

xml 形式の svn ログを操作すると、誤ってスクリプトでエラーが発生しました。エラーメッセージは次のとおりです。

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

入力データをデバッグすることで、何が間違っているかを見つけました。次に例を示します。

a=u'\u0440\u0435\u044c\u0434\u0437\u0444\u043a\u044b\u0443\u043a \u043c\u0443\u043a\u044b\u0448\u0449\u0442 \u0430\u0448\u0447'
>>> print a
реьдзфкыук мукышщт ашч
>>> print '{}'.format(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

フォーマットのどこが悪いのか教えてください。文字列バイトの前にuが表示され、UTF8 からデコードしようとしているようです。ただし、Python 3 では上記の例はエラーなしで動作します。

4

1 に答える 1

2

Unicode とバイト文字列の値が混在しています。Unicode形式を使用します。

print u'{}'.format(a)

デモ:

>>> a=u'\u0440\u0435\u044c\u0434\u0437\u0444\u043a\u044b\u0443\u043a \u043c\u0443\u043a\u044b\u0448\u0449\u0442 \u0430\u0448\u0447'
>>> print u'{}'.format(a)
реьдзфкыук мукышщт ашч

Python 3 では、文字列はデフォルトで Unicode 値です。Python 2 では、u"..."は Unicode 値を示し、通常の文字列 ( "...") はバイト文字列です。

バイト文字列と unicode 値を混在させると、デフォルトのコーデック (ASCII) で自動的にエンコードまたはデコードされます。このstr.format()メソッドは、Unicode 値を補間するバイト文字列にエンコードする必要があります。

于 2013-09-18T08:08:40.817 に答える