web-dev-qa-db-ja.com

UnicodeDecodeError、無効な継続バイト

以下の項目が失敗するのはなぜですか?そしてなぜ「latin-1」コーデックで成功するのでしょうか。

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

結果は次のとおりです。

 Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte
200
RuiDC

バイナリでは、0xE9は1110 1001のように見えます。ウィキペディアで UTF-8について読むと 、そのようなバイトの後に10xx xxxxの形式の2つが続く必要があることがわかります。だから、例えば:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

しかし、それが例外の機械的な原因にすぎません。この場合、ほぼ確実にラテン1でエンコードされた文字列があります。UTF-8とラテン1の外観が異なることがわかります。

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(注:ここではPython 2と3の表現を組み合わせて使用​​しています。入力はPythonのどのバージョンでも有効ですが、ご使用のPythonインタープリターは実際にはUnicodeとバイトの両方の文字列をこのように表示しません。)

209
Josh Lee

私はパンダread_csvメソッドでcsvファイルを開こうとしたときに私は同じエラーがありました。

解決策は、エンコーディングを 'latin-1'に変更することでした。

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')
162
Mazen Aly

無効なUTF-8です。その文字はISO-Latin1の中のe-急文字であり、それがそのコードセットで成功する理由です。

あなたがあなたが文字列を受け取っているコードセットを知らないならば、あなたは少し問題を抱えています。プロトコル/アプリケーションに単一のコードセット(できればUTF-8)を選択し、それからデコードしなかったコードセットを拒否するだけでよいのです。

それができない場合は、ヒューリスティックが必要です。

55

UTF-8はマルチバイトであり、あなたの\xe9とそれに続くスペースの組み合わせに対応する文字がないためです。

bothutf-8とlatin-1で成功するのはなぜですか?

ここで同じ文がutf-8にどのようにあるべきか

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'
40
neurino

開かれたばかりのファイルを操作しているときにこのエラーが発生した場合は、'rb'モードで開いたかどうかを確認してください。

5
Patrick Mutuku

私が.txtファイルからヘブライ語を含むテキストを読んでいる間に、これは私にも起こりました。

file -> save asをクリックし、このファイルをUTF-8エンコーディングとして保存しました

0
Alon Gouldman