以下の項目が失敗するのはなぜですか?そしてなぜ「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について読むと 、そのようなバイトの後に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とバイトの両方の文字列をこのように表示しません。)
私はパンダread_csvメソッドでcsvファイルを開こうとしたときに私は同じエラーがありました。
解決策は、エンコーディングを 'latin-1'に変更することでした。
pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')
無効なUTF-8です。その文字はISO-Latin1の中のe-急文字であり、それがそのコードセットで成功する理由です。
あなたがあなたが文字列を受け取っているコードセットを知らないならば、あなたは少し問題を抱えています。プロトコル/アプリケーションに単一のコードセット(できればUTF-8)を選択し、それからデコードしなかったコードセットを拒否するだけでよいのです。
それができない場合は、ヒューリスティックが必要です。
UTF-8はマルチバイトであり、あなたの\xe9
とそれに続くスペースの組み合わせに対応する文字がないためです。
bothutf-8とlatin-1で成功するのはなぜですか?
ここで同じ文がutf-8にどのようにあるべきか
>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'
開かれたばかりのファイルを操作しているときにこのエラーが発生した場合は、'rb'
モードで開いたかどうかを確認してください。
私が.txt
ファイルからヘブライ語を含むテキストを読んでいる間に、これは私にも起こりました。
file -> save as
をクリックし、このファイルをUTF-8
エンコーディングとして保存しました