エンジニアステップ

初心者エンジニア(1年目~3年目くらい)のための技術ブログ

WindowsでPython3使用時のUnicodeEncodeError(cp932,Shift-JISエンコード)の原因と回避方法

WindowsでPython3使用時のUnicodeEncodeError(cp932,Shift-JISエンコード)の原因と回避方法です。

こんなエラーが出ます。

UnicodeDecodeError: 'cp932' codec can't decode byte 0x8d in position 143: illegal multibyte sequence

対処方法は、

with open('dp.html', encoding='utf-8') as f:

とエンコーディングの指定です。

 

windows環境でUnicodeEncodeError発生時の環境

発生時の環境は以下の通り(バージョン略)

  • Windows10
  • Python3
  • Anacond

 

UnicodeEncodeErrorの発生原因

UnicodeEncodeErrorの発生原因について。

Windows環境ではデフォルトの標準出力はCP932への変換が行われる。

 

Python3では、文字列に関する型は2種類あります。

  • str型(Unicode専用)
  • byte型(任意のエンコーディング)

 

今回の問題はPython3内部ではstr型(UTF-8)だったのに、byte型(cp932)に変換しようとしたことが原因です。

※Windowsが自動で変換しようとしているが、str型なので「CP932」に変換出来ない。その結果、UnicodeEncodeError例外が発生する。

 

今回、私は以下のopen関数wお使おうとしました

with open('dp.html') as f:
html = f.read()

この時、open関数のデフォルトのencoding方式はプラットフォーム依存です。

その結果、先程の問題が発生しています。

そこで、open関数に引数で「エンコーディング」を指定します。

with open('dp.html', encoding='utf-8') as f:

 

これでOK。