0

Python で Unicode 文字列をファイルに書き込もうとしていますが、Linux の「cat」または「less」を使用してファイルを読み取ると、正しい文字が書き込まれず、代わりにゴミとして表示されます。

Oracle データベースからオブジェクトを読み取っています。タイプを出力すると(aはデータベース結果の行です):

logger.debug(type(a[index])) 

それは出力します:

<type 'unicode'>

次のように書き込み用にファイルを開きます。

ff = codecs.open(filename, mode='w', encoding='utf-8')

そして、次のようにファイルに行を書き込みます。

ff.write(a[index]))

しかし、出力ファイルを読むと、正しくアクセント付きの文字が表示されず、代わりにゴミが表示されます:

$Bu��rger, Udo, -1985. Way to perfect horsemanship

PythonでUnicode文字列オブジェクトをファイルに正しく書き込むにはどうすればよいですか?

4

1 に答える 1

2

どうやって文字列の文字化けにたどり着いたか推測できます。それはかなり複雑です。

何かがバイトから Unicode にテキストをデコードしerror='replace'、認識されなかったバイトが置換文字に置き換えられたため、間違ったコーデックが使用されたという事実を隠しました。

結果として得られたU+FFFD REPLACEMENT CHARACTERコードポイントを持つ Unicode テキストは、UTF-8 にエンコードされましたが、生のバイトをそのままcatまたは出力する端末によって、Latin 1 として再度デコードされました。les

この方法でエンコードされたテキストは次のとおりです。

>>> print u'$Bu��rger, Udo, -1985. Way to perfect horsemanship'.encode('latin1').decode('utf8')
$Bu��rger, Udo, -1985. Way to perfect horsemanship

おそらく、これはBürger, Udo, - 1985. UTF-8 では CC 88 であったが、ASCII としてデコードできない文字とU+0308 COMBINING DIAERESISüコードポイントによって形成された完全な馬術への道:u

>>> text = u'Bu\u0308rger, Udo, - 1985. Way to perfect horsemanship'
>>> print text
Bürger, Udo, - 1985. Way to perfect horsemanship
>>> text.encode('utf8')
'Bu\xcc\x88rger, Udo, - 1985. Way to perfect horsemanship'
>>> text.encode('utf8').decode('ascii', errors='replace')
u'Bu\ufffd\ufffdrger, Udo, - 1985. Way to perfect horsemanship'

この話の教訓:何をしているのか完全に確信が持てない限り、使用しerrors='replace'ないでください。

于 2014-05-24T21:55:47.103 に答える