4

これはpython 2.4にあります。これが私の状況です。データベースから文字列を取得すると、ウムラウト付きの 'o' (\xf6) が含まれています。この時点で type(value) を実行すると、str が返されます。次に、.decode('utf-8') を実行しようとすると、エラーが発生します ('utf8' コーデックは位置 1 ~ 4 のバイトをデコードできません)。

ここでの本当に私の目標は、type(value) が Unicode を返すようにすることです。いくつかの有用な情報を含む以前の質問を見つけました が、選択した回答の例は実行できないようです。ここで私が間違っていることはありますか?

再現するコードは次のとおりです。

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

最初のステートメントで失敗するため、実際に書き込みステートメントに到達することはありません。

ご協力ありがとうございました。

編集:

DBの文字セットがutf8であることを確認しました。そのため、再現するコードで「\xf6」を「\xc3\xb6」に変更しましたが、それでもエラーが発生します。「utf-8」と「utf8」に違いはありますか?

コーデックを使用したファイルへの書き込みに関するヒントは便利ですが (私は間違いなく使用します)、このシナリオでは、デバッグ目的でログ ファイルに書き込むだけです。

4

4 に答える 4

10

文字列がUTF8 エンコーディングではありません。文字列を Unicode に「デコード」する場合、文字列はパラメーターで指定したエンコーディングである必要があります。私はこれを試しましたが、完全に機能します:

print 'w\xf6rner'.decode('cp1250')

編集

Unicode 文字列をファイルに書き込むには、コーデック モジュールを使用できます。

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

入力/出力のエンコーディングを指定し、コード全体で「unicode」文字列を使用すると、さまざまなエンコーディングを気にすることなく便利です。

于 2009-03-20T14:43:51.977 に答える
5

明らかに1バイトエンコーディングです。UTF-8 の「ö」は「\xc3\xb6」です。

エンコーディングは次のようになります。

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • 勝利-1250
  • 勝つ-1252
于 2009-03-20T14:55:11.027 に答える
3

「ISO-8859-1」を使用する必要があります。

Name = 'w\xf6rner'.decode('iso-8859-1')
file.write('Name: %s - %s\n' %(Name, type(Name)))

utf-8 は ascii 以外のものをエスケープするために 2 バイトを使用しますが、ここでは 1 バイトだけなので、おそらく iso-8859-1 が正しいでしょう。

于 2009-03-20T14:41:06.757 に答える
2

したがって、再現するコードで '\xf6' を '\xc3\xb6' に変更しましたが、まだエラーが発生します

最初の行ではありません:

>>> 'w\xc3\xb6rner'.decode('utf-8')
u'w\xf6rner'

ただし、2 行目はエラーになります。

>>> file.write('Name: %s - %s\n' %(Name, type(Name)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

非ASCII Unicode文字をバイトストリームに書き込もうとすると、これは完全にあなたが期待することです。コーデックでラップされたストリームに関する Jiri の提案を使用する場合は、Unicode を直接書き込むことができます。それ以外の場合は、Unicode 文字列を手動でバイトに再エンコードする必要があります。

ログを記録するためには、単純に変数の repr() を吐き出す方がよいでしょう。そうすれば、そこにある Unicode 文字や、改行やその他の不要な文字について心配する必要はありません。

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'
于 2009-03-20T16:01:34.050 に答える