2017-09-19 9 views
1

私は、データベース内のフィールドにチルド(ñ)を含む文字nを持っています。私のDjangoアプリケーションでは、文字列として使用しようとするといくつか問題が生じています。Python 2.7 UnicodeEncodeエラー

私はREPLで値にアクセスするとき、それはこのように現れる:

>>> person.last_name 
u'xxxxxxa\xf1oxxxx' 
>>> str(person.last_name) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in  position 15: ordinal not in range(128) 

は私が間違っている場合してください、私を修正して - 私はそれが\xf1文字列が内部に収容されている問題だと考えていますUnicode文字列であり、これは異なって扱われていたはずですこの値はUnicode文字列になります...しかし、それは症状か実際の病気かどうかはわかりません。

だから私はこれについて何をすべきか分かりません。おそらくこの値が間違って最初に格納されていますか?たぶん、正しくデコードする方法を教えてくれる人が必要なのでしょうか?私の目標は、この値をCSVに書き込むことです。最終的には、それをstr()まで実行する必要があります。どうもありがとう!

+0

最も簡単な方法はpython3に変更しています。 python2の締め切り日の数ヶ月前です。 – Sraw

+0

それは私たちのロードマップですが、この情報はおそらく私がもう少し必要性を推進するのに役立ちます。ありがとう。 – YellowShark

答えて

2

文字 - はユニコード文字LATIN SMALL LETTER N WITH TILDE(U + 00F1)です。したがって、あなたが見ているユニコード文字列は正しいです。 Pythonはエスケープ文字\ xf1を表示します。実際にはユニコード文字列U + 00F1のコンテキストで意味します。

デコードするものはありません。ファイルなどのバイトストリームにUnicode文字列を書き込む場合は、エンコードにする必要があります。

str(foo)ここで、fooはユニコード文字列です。これはfoo.encode('ascii')に相当します。ただし、文字ñはASCIIエンコーディングでは存在しないため、エラーが発生します。代わりに

あなたがUnicode文字列の表現をエンコードされたバイナリを、したい場合は、あなたが欲しいエンコードするのかを知ると、手動でエンコードする必要があります:

>>> foo = u'xxxxxxa\xf1oxxxx' 
>>> foo.encode('utf8') 
'xxxxxxa\xc3\xb1oxxxx' 
>>> foo.encode('latin1') 
'xxxxxxa\xf1oxxxx' 

単にあなたがそうでなければ、あなたのCSVファイルのエンコーディングを使用してください無効な文字があります。ところでパイソン3とtrueになります

同じ、唯一のあなたのUnicode文字列はstr型になりますし、あなたのエンコードされた文字列は、bytesタイプになります:あなたはstrunicodeを変換する簡単なのpython encode機能を使用することができます

>>> foo = u'xxxxxxa\xf1oxxxx' # note the u prefix is accepted for compatibility but has no effect 
>>> foo.encode('utf8') 
b'xxxxxxa\xc3\xb1oxxxx' 
>>> foo.encode('latin1') 
b'xxxxxxa\xf1oxxxx' 
+0

ありがとうございます!これは間違いなく助けになりました。私の最終的な解決策は、try/exceptブロックを使ってUnicodeDecodeエラーをキャプチャし、コード行を再試行するだけですが、 'str()'を実行しないでください。それが私の問題でした。再度、感謝します! – YellowShark

1

。 2番目のパラメータignoreは、Pythonがその特定の形式でエンコードできない文字を無視するものです。

In [1]: foo = u'xxxxxxa\xf1oxxxx' 

In [2]: foo.encode('ascii', 'ignore') 
Out[2]: 'xxxxxxaoxxxx' 

In [3]: foo.encode('utf-8', 'ignore') 
Out[3]: 'xxxxxxa\xc3\xb1oxxxx'