2009-03-20 13 views
3

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

本当に私の目標は、タイプ(値)がユニコードを返すようにすることです。いくつかの有益な情報があるearlier question が見つかりましたが、選択した回答の例は私のために実行されていないようです。私がここで間違っていることはありますか?ここで

は再現するいくつかのコードです:

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

それが最初の文に失敗したので、私は実際には、書き込みステートメントに取得することはありません。

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

編集:

私は、DBの文字セットがUTF8であることを確認しました。だから私のコードを再現するには、 '\ xf6'を '\ xc3 \ xb6'に変更しましたが、まだ失敗しています。 'utf-8'と 'utf8'の違いはありますか?

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

+0

データベーステーブルではどのような文字セットを使用していますか?私はそれがおそらくutf-8ではないと推測しています。代わりに 'decode'に渡してみてください。 – elo80ka

答えて

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' 
3

あなたは "ISO-8859-1" を使用する必要があります。

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

UTF-8は何も外アスキーを逃れるために2つのバイトを使用しますが、ここではそれだけで1バイトですので、ISO-8859-1は、おそらくです正しい。

10

文字列は、UTF8エンコーディングではではありません。文字列をUnicodeにデコードする場合、文字列はパラメータで指定されたエンコーディングである必要があります。

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

のエンコーディングを指定するために便利です:私はこれを試してみましたが、それが完璧に動作します:

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

EDIT

を使用すると、コーデックモジュールを使用することができ、ファイルにUnicode文字列を書くためのさまざまなエンコーディングを気にせずに、コード全体で 'unicode'文字列を使用します。

+0

+1は 'import codecs'と' codecs.open() 'です。素晴らしいもの! – mknaf

5

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

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

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • のWin-1250
  • win-1252
関連する問題