web-dev-qa-db-ja.com

Python Unicode文字列で誤ってエンコードされた文字を処理する

私は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を含む文字列が表示されました。

17
strfry

あなたのユニコード文字列は結構です:

>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'

インタラクティブプロンプトで表示される問題は、インタプリタが文字列を端末に出力するために使用するエンコーディングを認識していないため、「ascii」コーデックにフォールバックしますが、そのコーデックは=の処理方法しか認識しません。 ASCII文字。私のマシンでは正常に動作します(sys.stdout.encodingが私にとって "UTF-8"であるため、おそらく環境変数の設定などがユーザーのものと異なるためです)

>>> print u'Gl\xfcck'
Glück
7
Croad Langshan

いくつかのエンコーディングを使用して、Unicode文字列を標準文字列に変換する必要があります。 utf-8:

some_unicode_string.encode('utf-8')

それとは別に、これは

クラス属性付きのBeautifulSoup findall-ユニコードエンコードエラー

とSOに関する少なくとも10の他の関連する質問。最初に研究しなさい。

12
Andreas Jung

コードの最初、インポートの直後に、これらの3行を追加します。

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')

プログラムの過程で、システムのデフォルトのエンコーディング(ASCII)を上書きします。

編集:結果が確実でない限り、これを行うべきではありません。以下のコメントを参照してください。この投稿も役に立ちます: sys.setdefaultencoding( 'utf-8')の危険性

4
az3

しないstr()モデルフィールドから取得したものを、Unicode文字列である限り、文字列にキャストしないでください。 (私が完全に見逃しているのは、Django関連ではないことです)

0
Artie