web-dev-qa-db-ja.com

Python ASCIIおよびUnicodeデコードエラー

データベースに特定の文字列を挿入すると、この非常にイライラするエラーが発生しました。それは次のようなものを言いました:

PythonはUnicodeを期待してバイト文字をデコードできません」

何度も検索した結果、文字列を nicode にエンコードすることで、このエラーを解決できることがわかりました。最初に文字列をデコードし、次に TF-8 形式でエンコードすることでこれを試みます。お気に入り:

string = string.encode("utf8")

そして、私は次のエラーを受け取ります:

'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

私はこのエラーで死にました!どうすれば修正できますか?

14
Amitash

編集:反対票からわかるように、これは最善の方法ではありません。このすぐ後に、優れた非常に推奨される答えが表示されるので、良い解決策を探しているなら、それを使用してください。これは、後ほど親切にならないハックなソリューションです。

私はあなたの痛みを感じます、私は同じエラーで多くの問題を抱えてきました。私がそれを解決した最も簡単な方法(これは最善の方法ではない可能性があり、アプリケーションによって異なります)は、物事をUnicodeに変換し、エラーを無視することでした。これが nicode HOWTO-Python v2.7.3のドキュメント の例です。

>>> unicode('\x80abc', errors='strict')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
                    ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'

これは最も便利な方法ではないかもしれませんが、これは私にとってうまくいった方法です。

編集:

コメントのカップルは、質問者が答えを受け入れたとしても、これは悪い考えだと述べています。それは素晴らしいアイデアではありません。ヨーロッパやアクセント付きの文字を扱っている場合は、物事が台無しになります。ただし、これは、本番レベルのコードではなく、作業中の個人プロジェクトであり、作業を進めるための迅速な修正が必要な場合に使用できます。最終的には、以下の回答に記載されている正しい方法で修正する必要があります。

5

規律あるアプローチを取る必要があります。 実用的なUnicode、またはどのようにして痛みを止めるか? には、必要なものがすべて揃っています。

そのコード行でエラーが発生した場合、問題はstringがバイト文字列であり、Python 2が暗黙的にそれをUnicodeにデコードしようとしていることです。しかし、それは純粋なアスキーではなく、エンコーディングが何であるかを知り、適切にデコードする必要があります。

49
Ned Batchelder

encodeメソッドをunicodeオブジェクトで使用して、指定のエンコーディングでstrオブジェクトに変換する必要があります。特定のエンコーディングのdecodeオブジェクトに対してstrメソッドを使用して、unicodeオブジェクトに変換する必要があります。

あなたのデータベースは文字列をUTF-8で保存していると思います。したがって、データベースから文字列を取得したら、str.decode('utf-8')を実行して、それらをunicodeオブジェクトに変換します。次に、pythonプログラムでunicodeオブジェクトのみを使用します(リテラルは_u'unicode string'_で定義されます)。そして、データベースに格納する直前に、strオブジェクトとuni.encode('utf-8')

12

0xE3コードポイントは、Unicodeのチルダ付きの「a」です。元の文字列はUTF-8である可能性が高いため、デフォルトのASCII文字セットを使用してそれをデコードすることはできません。

2
Silas Ray

string in python 2.7はエコードされた文字列です(ASCIIほとんどがエンコードされています)ですが、文字列やユニコードではありません。

したがって、string.encode( 'some encoding')を実行すると、実際にはエンコードされた文字列がエンコードされます(エンコードを使用して)

Pythonは、最初にデフォルトのエンコーディング(python 2.7のASCII)を使用してその文字列をデコードする必要があります。その後、さらにエンコードします。文字列はASCII他のエンコーディング(UTF8、LATIN-1 ..)なので、pythonがASCIIを使用してこれをデコードしようとすると、ASCIIコーデックは指定された文字列のいくつかの文字をデコードできないため、エラーをスローします。 ASCII range(0-127)の範囲外

#to encode above given string, first decode that using some encoding
decoded_string = string.decode('utf8')
#now encode that decoded string
decoded_string.encode('utf8')
0
keshav