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:

とエンコーディングを指定すればOKです。

 

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関数を使おうとしました

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

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

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

 

そこで、open関数に引数で「エンコーディング」を指定すれば対応ができるというわけです。

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

 

以上、「WindowsでPython3使用時のUnicodeEncodeError(cp932,Shift-JISエンコード)の原因と回避方法」というお話でした。

コメントはお気軽にどうぞ