1. ホーム
  2. python

[解決済み】UnicodeDecodeError, invalid continuation byte

2022-02-09 01:25:39

質問

以下の項目はなぜ失敗するのでしょうか?コーデックがquot;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

解決方法は?

バイナリでは、0xE9は次のようになります。 1110 1001 . を読むと ウィキペディアのUTF-8 という形式のバイトが2つ続かなければならないことがわかります。 10xx xxxx . そこで、例えば

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

しかし、それはあくまで例外の機械的な原因である。この場合、ほぼ間違いなくlatin 1でエンコードされた文字列があります。UTF-8とlatin 1がどのように異なって見えるか、おわかりいただけると思います。

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

(注意:ここではPython 2と3の混在した表現を使っています。入力はどのバージョンのPythonでも有効ですが、あなたのPythonインタプリタが実際にこの方法でユニコードとバイト文字列の両方を表示することはまずないでしょう)。