私はpython-lastfmライブラリによって返されるUnicode文字列を処理しています。
途中で、ライブラリがエンコーディングを間違って取得し、無効な文字を含む可能性のあるUnicode文字列を返すと思います。
たとえば、変数aに期待している元の文字列は "Glück"です。
>>> a u'Gl\xfcck ' >>> print a Traceback(最後の最新の呼び出し): File " "、 の1行目。UnicodeEncodeError: 'ascii'コーデックは位置2の文字u '\ xfc'をエンコードできません:序数が範囲内にありません(128)
\ xfcは、エスケープされた値252です。これは、「ü」のlatin1エンコーディングに対応します。どういうわけか、これはユニコード文字列にpythonはそれ自体では処理できません)に埋め込まれます。
これを元の「グリュック」を含む通常の文字列またはUnicode文字列に変換するにはどうすればよいですか?デコード/エンコードメソッドをいじってみましたが、UnicodeEncodeError、またはシーケンス\ xfcを含む文字列が表示されました。
あなたのユニコード文字列は結構です:
>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'
インタラクティブプロンプトで表示される問題は、インタプリタが文字列を端末に出力するために使用するエンコーディングを認識していないため、「ascii」コーデックにフォールバックしますが、そのコーデックは=の処理方法しか認識しません。 ASCII文字。私のマシンでは正常に動作します(sys.stdout.encodingが私にとって "UTF-8"であるため、おそらく環境変数の設定などがユーザーのものと異なるためです)
>>> print u'Gl\xfcck'
Glück
いくつかのエンコーディングを使用して、Unicode文字列を標準文字列に変換する必要があります。 utf-8:
some_unicode_string.encode('utf-8')
それとは別に、これは
クラス属性付きのBeautifulSoup findall-ユニコードエンコードエラー
とSOに関する少なくとも10の他の関連する質問。最初に研究しなさい。
コードの最初、インポートの直後に、これらの3行を追加します。
import sys # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')
プログラムの過程で、システムのデフォルトのエンコーディング(ASCII)を上書きします。
編集:結果が確実でない限り、これを行うべきではありません。以下のコメントを参照してください。この投稿も役に立ちます: sys.setdefaultencoding( 'utf-8')の危険性
しないstr()モデルフィールドから取得したものを、Unicode文字列である限り、文字列にキャストしないでください。 (私が完全に見逃しているのは、Django関連ではないことです)