web-dev-qa-db-ja.com

UnicodeDecodeError:「utf8」コーデックは位置3-6のバイトをデコードできません:無効なデータ

ユニコードはpython2でどのように機能しますか?わかりません。

ここでは、サーバーからデータをダウンロードし、JSON用に解析します。

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.Egg/eventlet/hubs/poll.py", line 92, in wait
    readers.get(fileno, noop).cb(fileno)
  File "/usr/local/lib/python2.6/dist-packages/eventlet-0.9.12-py2.6.Egg/eventlet/greenthread.py", line 202, in main
    result = function(*args, **kwargs)
  File "Android_suggest.py", line 60, in fetch
    suggestions = suggest(chars)
  File "Android_suggest.py", line 28, in suggest
    return [i['s'] for i in json.loads(opener.open('https://market.Android.com/suggest/SuggRequest?json=1&query='+s+'&hl=de&gl=DE').read())]
  File "/usr/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.6/json/decoder.py", line 336, in raw_decode
    obj, end = self._scanner.iterscan(s, **kw).next()
  File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/usr/lib/python2.6/json/decoder.py", line 217, in JSONArray
    value, end = iterscan(s, idx=end, context=context).next()
  File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/usr/lib/python2.6/json/decoder.py", line 183, in JSONObject
    value, end = iterscan(s, idx=end, context=context).next()
  File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/usr/lib/python2.6/json/decoder.py", line 155, in JSONString
    return scanstring(match.string, match.end(), encoding, strict)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 3-6: invalid data

ありがとうございました!!

編集:次の文字列はエラーを引き起こします:'[{"t":"q","s":"abh\xf6ren"}]'\xf6öにデコードする必要があります(abhören)

51
ihucos

JSONとして解析しようとしている文字列はUTF-8でエンコードされていません。ほとんどの場合、ISO-8859-1でエンコードされています。以下を試してください:

json.loads(unicode(opener.open(...), "ISO-8859-1"))

JSONメッセージで取得される可能性のあるウムラウトを処理します。

Joel Spolskyの すべてのソフトウェア開発者がUnicodeで文字セットについて絶対に、積極的に知っておくべき絶対最小値(言い訳なし!) を読む必要があります。 Unicodeに関して発生している問題を明らかにすることを願っています。

私の解決策は少し面白いです.UTF-8コーデックと同じくらい簡単に保存できるとは思っていませんでした.notepad ++(v5.6.8)を使用していますが、最初にANSIコーデックで保存したことに気付きませんでした。すべてのローカライズされた辞書を配置するために個別のファイルを使用しています。 Notepad ++の[エンコード]タブでソリューションを見つけました。[BOMなしのUTF-8でエンコード]を選択して保存します。それは見事に動作します。

6
rolypoly

このエラーは、リモートエンドから受信したデータが有効なJSONではないことを意味しています。 JSON(仕様によれば)は通常UTF-8ですが、UTF-16またはUTF-32(ビッグエンディアンまたはリトルエンディアン)にすることもできます。表示される正確なエラーは、データの一部が有効なUTF-8

おそらく、データを盲目的にjson.loads()に渡すのではなく、リモートエンドから受け取った実際の応答を調べる必要があります。現時点では、応答からすべてのデータを文字列に読み取り、それがJSONであると想定しています。代わりに、応答のコンテンツタイプを確認してください。 Webページが実際にJSONを要求していることを確認してください。たとえば、ではない JSONというエラーメッセージではありません。

(また、応答を確認した後、すべてのデータを文字列に読み込んでjson.load()に渡す代わりに、opener.open()によって返されるファイルのようなオブジェクトを渡すことでjson.loads()を使用します。)

4
Thomas Wouters

エンコーディングをLatin1/ISO-8859-1に変更するソリューションは、tex4htの出力で呼び出されるhtml2text.pyで見られた問題を解決します。 LaTeX文書の自動Wordカウントにそれを使用します。tex4htはそれらをHTMLに変換し、html2text.pyはwc -wでさらにカウントするためにそれらを純粋なテキストに取り除きます。たとえば、ドイツ語の「Umlaut」が文献データベースエントリから入った場合、html2text.pyが文句を言うので、そのプロセスは失敗します。

UnicodeDecodeError: 'utf8'コーデックは位置32243-32245のバイトをデコードできません:無効なデータ

これにより、これらのエラーを追跡するのが特に難しくなり、基本的に、参照セクションにUmlautを含める必要があります。 html2text.py内からの簡単な変更

data = data.decode(encoding)

data = data.decode( "ISO-8859-1")

その問題を解決します。 HTMLファイルを最初のパラメーターとして使用してスクリプトを呼び出す場合は、エンコードを2番目のパラメーターとして渡し、変更を省くことができます。

3
Matthias Nott

これをコマンドラインに貼り付けます。

export LC_CTYPE="en_US.UTF-8" 
1
Mark Francis

誰かが同じ問題を抱えている場合に備えて。 YouCompleteMe でvimを使用していますが、このエラーメッセージでycmdを起動できませんでした。export LC_CTYPE="en_US.UTF-8"、問題はなくなりました。

1

Android_suggest.pyで、その巨大な1行のreturnステートメントをone_step_at_a_timeの断片に分割します。 repr(string_passed_to_json.loads)をログに記録して、例外が発生した後にチェックできるようにします。目玉の結果。問題が明らかでない場合は、質問を編集して担当者を表示します。

0
John Machin

一時的な回避策:unicode(urllib2.urlopen(url).read(), 'utf8')-これは動作するはずですif返されるものはUTF-8です。

urlopen().read()はバイトを返すため、それらをUnicode文字列にデコードする必要があります。また、 http://bugs.python.org/issue47 からパッチを確認すると役立ちます。

0
sorin