13

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

Pythonはバイト文字をデコードできません。Unicodeが必要です。」

多くの検索を行った後、文字列をUnicodeにエンコードすることでこのエラーを克服できることがわかりました。最初に文字列をデコードしてから、 UTF-8形式でエンコードすることでこれを実行しようとしています。好き:

string = string.encode("utf8")

そして、次のエラーが発生します。

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

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

4

5 に答える 5

50

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

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

于 2012-07-18T15:12:47.733 に答える
12

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

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

于 2012-07-18T15:15:25.990 に答える
5

編集:反対票からわかるように、これはそれを行うための最良の方法ではありません。この直後に優れた、強く推奨される答えがありますので、良い解決策を探しているなら、それを使ってください。これはハック的な解決策であり、後であなたに親切になることはありません。

私はあなたの痛みを感じます、私は同じエラーで多くの問題を抱えています。私がそれを解決した最も簡単な方法(そしてこれは最善の方法ではないかもしれません、そしてそれはあなたのアプリケーションに依存します)は物事をユニコードに変換し、エラーを無視することでした。UnicodeHOWTOの例を次に示します-Pythonv2.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'

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

編集:

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

于 2012-07-18T15:19:06.507 に答える
2

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

于 2012-07-18T15:12:33.860 に答える