こんにちは、PyQサポートです。
今回は、 UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence
というエラーの原因と解消方法を紹介します。
質問: UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence を解消する方法を教えてください
UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence
とエラーが表示されました。このエラーの原因がわからないので教えてください。
入力した内容(コード)
b = "日本語".encode("utf-8") b.decode("cp932")
出たエラー(実行結果)
Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence
回答: エンコードとデコードの文字エンコーディングの違いにより発生するエラーです。文字エンコーディングを統一することで解消します。
文字列から文字エンコーディングの UTF-8 でエンコードしたバイト列を、文字エンコーディングの cp932 (Microsoftコードページ932)でデコードしているために発生しているエラーです。
文字列.encode(エンコーディング名)
は、指定した文字エンコーディング UTF-8 に従って文字列をバイト列(コンピューターがわかる形式のデータ)に変換できます。
これを異なる文字エンコーディング cp932 で元に戻そうとしたためにエラーが発生しました。
文字エンコーディングを UTF-8 にするとエラーを発生させることなく変換できます。
>>> b = "日本語".encode("utf-8") # エラーになる >>> b.decode("cp932") UnicodeDecodeError: 'cp932' codec can't decode byte 0x9e in position 8: incomplete multibyte sequence # 元の文字エンコーディングと同じならエラーにならない >>> b.decode("utf-8") '日本語'
エンコード
エンコードとは後で戻せる形の符号(バイト列)に変換することです。
符号に変換するのはコンピューターで扱いやすくするためです。
デコード
符号(バイト列)を文字列に変換することです。
バイト列を文字列にデコードする場合、正しい文字エンコーディングを選択する必要があります。
文字エンコーディングとエンコード/デコードの関係
文字エンコーディングとはコンピューターで文字を表現するために割り当てられている規則です。
この規則を使って、人間にわかりやすい文字をコンピューターで扱う形式に変換したり(エンコード)、コンピューターに保存されている情報を人間にわかりやすい文字に変換したりします(デコード)。
文字エンコーディングには複数の種類(Shift_JIS、UTF-8など)があります。
たとえば「日本語」を文字エンコーディング UTF-8 の規則を使って変換(エンコード)すると、 b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
というバイト列になります。
これを文字列に戻す場合(デコード)は、文字エンコーディング UTF-8 を使う必要があります。
>>> b = "日本語".encode("utf-8") >>> b b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
エラーが出た時の考え方
学習を重ねてくると、「プロのエンジニアはエラーをどのように解決するのだろう?」という疑問が湧いて来ます。
ここでは、あなたのPythonプログラミングのレベル上げに役立つ記事、「エンジニアの「プロの所作」04」を紹介します。
この記事では、「プロはエラーをどのように捉えて、どのように対処しているのか」ということをプロの目線で解説しています。
よりレベルアップしたい方は読んでみてください!
この記事を読むとどんなことが理解できるか
「どこで」エラーが起きていて、「どうやって」エラーを直すかがわかり、「どこを直して」対応するといいか考えられるようになります。
記事と同じような場面に遭遇したときにも応用がきくようになります。