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エンコード)の原因と回避方法」というお話でした。