【5分で解決】UnicodeEncodeError: ‘cp932’ codecのエラー

【5分で解決】UnicodeEncodeError: 'cp932' codecのエラー

 

【悩み】
・Pythonのプログラムを実行したけど異常終了して動かない。
・UnicodeEncodeError: ‘cp932’ codec can’t encode character ‘\u2781’ in
 position 54: illegal multibyte sequenceというエラーが出力されたけど何?
・UnicodeEncodeError: ‘cp932’ codecの原因と解消方法を知りたい。



こういった「悩み」に答えます。
 

【本記事の内容】
① UnicodeEncodeError: ‘cp932’ codec can’t encode characterの発生経緯
➁ UnicodeEncodeError: ‘cp932’ codec can’t encode characterの発生原因
➂ UnicodeEncodeError: ‘cp932’ codec can’t encode characterの解決方法



本記事を実践したことで、5分くらいで「UnicodeEncodeError: ‘cp932’ codec can’t encode character」のエラーを解決できました。
 

記事の前半では「2パターンの本エラー発生経緯」を解説します。
記事の後半では「本エラーの発生原因」から「解決方法」までを紹介します。
 

この記事を読み終えることで、「エラーで動かないPythonプログラムを解消でき、正常に動く状態」になるはずです。

 

UnicodeEncodeError: ‘cp932’ codec can’t encode characterの発生経緯


本エラーの発生経緯のパターンとして、以下があります。
 

【本エラー発生経緯のパターン】
・Pythonから文字などをファイルへ書き出した際に本エラーが発生
・Pythonで文字列をコマンドプロンプトへ出力した際に本エラーが発生



以降で、上記の各パターンに関して詳しく解説します。
 

Pythonから文字などをファイルへ書き出した際に本エラーが発生

筆者は、以下のようなPythonプログラムをWindows上で実行しようと考えていました。

import mammoth

# 対象のワードファイルのPATH
word_path = './sample.docx'

# 変換後のHTMLファイルのPATH
html_path = './output/sample.html'

# 対象のワードファイルを読み込みmarkdownファイルへ変換
with open(word_path, "rb") as docx_file:
    result = mammoth.convert_to_html(docx_file)

# 変換した文字をファイルへ保存
with open(html_path, "w") as html_file:
    html_file.write(result.value)



上記プログラムを「test.py」というファイル名で保存します。
上記プログラムは、ワードファイルに記載された文字を読み込み、変換後に文字をファイルへ保存するプログラムです。

保存したファイルを実行するために、以下のコマンドを実行したところ、「UnicodeEncodeError: ‘cp932’ codec can’t encode character」が発生しました。

python test.py
Traceback (most recent call last):
  File "C:\Users\user\test.py", line 15, in <module>
    html_file.write(result.value)
UnicodeEncodeError: 'cp932' codec can't encode character '\u2781' in position 54: illegal multibyte sequence


 

Pythonで文字列をコマンドプロンプトへ出力した際に本エラーが発生

筆者は、以下のようなPythonプログラムをWindows上で実行しようと考えていました。

import requests
from bs4 import BeautifulSoup

url = 'https://xxxx'
source=requests.get(url, headers=headers).text
soup = BeautifulSoup(source, 'lxml')
search_div = soup.find_all(class_='rc')
text = ''
for result in search_div:
・
・
・
抽出した情報をtextへ格納する処理
・
・
・
print(text)



上記プログラムを「test.py」というファイル名で保存します。
上記プログラムは、スクレイピングした結果から情報を抽出し、コマンドプロンプトに出力するプログラムです。

保存したファイルを実行したところ、「UnicodeEncodeError: ‘cp932’ codec can’t encode character」が発生しました。
 

以上が、「UnicodeEncodeError: ‘cp932’ codec can’t encode character の発生経緯」となります。


 

UnicodeEncodeError: ‘cp932’ codec can’t encode characterの発生原因


本事象の「発生原因」に関して解説します。
 

発生原因は、「Windowsが文字を自動的にCP932というエンコーディング(文字コード)に変換するから」です。



本事象の詳しい発生原因を以下に掲載します。
 

【発生原因】
エラーの意味:
 「ある文字をCP932の文字コードに変換できません」です。
エラー箇所:
 print関数やwrite関数を実行する際にエラーが発生
原因:
 print関数やwrite関数で文字コード「CP932」に変換できない文字を
 含んでいたため
補足:
 WindowsではCP932という文字コードを採用しています。
 そのため、ファイルや標準出力する際にCP932に自動変換されます。

 

WindowsとPythonの文字コードについて



以上が、「UnicodeEncodeError: ‘cp932’ codec can’t encode characterの発生原因」となります。
 

Windowsが採用している文字コードのため本エラーが発生します。以降で、いくつかの解決方法を説明します。


 

UnicodeEncodeError: ‘cp932’ codec can’t encode characterの解決方法


本エラーの解決方法として、いくつかの方法があります。
 

【解決方法】
・ファイル入出力の場合:encoding=’utf-8’を指定
・CP932への変換に失敗した文字を削除
・CP932への変換に失敗した文字を無視



以降で、上記の各方法に関して詳しく解説します。
 

ファイル入出力の場合:encoding=’utf-8’を指定

write関数などのファイル入出力時に本エラーが発生した場合、以下のように「encoding=’utf-8’」を指定することで、本エラーを解消できます。

import mammoth

# 対象のワードファイルのPATH
word_path = './sample.docx'

# 変換後のHTMLファイルのPATH
html_path = './output/sample.html'

with open(word_path, "rb") as docx_file:
    result = mammoth.convert_to_html(docx_file)
with open(html_path, "w", encoding='utf-8') as html_file:
    html_file.write(result.value)

 

【open関数の構文】
・機能
 指定したエンコーディングでファイルを開く
・使い方
 open(ファイルPATH, モード, encoding=エンコーディング)
・参照
 open関数のリファレンス(公式サイト)


 

CP932への変換に失敗した文字を削除

コマンドプロンプトへ出力した際に本エラーが発生した場合、以下のようなエラー内容が出力されます。

UnicodeEncodeError: 'cp932' codec can't encode character '\u2781' in position 54: illegal multibyte sequence


エラー内容に記載された文字を削除することで、本エラーを解消できます。上記エラーの場合、以下のreplace関数を使い「\u2781」を削除することで、本エラーを回避できます。

new_text = text.replace('\u2781', '')
print(new_text)

 

【replace関数の構文】
・機能
 指定した文字を別の文字に置換する
・使い方
 replace(置換したい文字, 置換後の文字)
・参照
 replace関数のリファレンス(公式サイト)


 

CP932への変換に失敗した文字を無視

先ほど紹介したreplace関数で対処した場合、CP932に変換できない全ての文字を置換する必要があります。そのため、変数などに格納された文字において、CP932に変換できない文字を洗い出す必要があり非常に手間です。

そこで、以下のencode関数を使うことで、本エラーを容易に解消できます。

new_text = text.encode('cp932', 'replace')
print(new_text)

 

【encode関数の構文】
・機能
 文字コードを変換する
・使い方
 encode(変換したい文字コード, <任意:変換に失敗した際の処理>)
・補足
 変換に失敗した際の処理として以下を指定できる
 strict:変換できなかった場合エラーを発行する
 ignore:変換できなかった文字を無視する
 replace:変換できなかった文字を疑問符(?)に置換する
 xmlcharrefreplace:変換不可な文字の前にXML文字参照を挿入する
 backslashreplace:変換不可な文字の前にエスケープシーケンスを挿入する
・参照
 encode関数のリファレンス(公式サイト)



以上のようにして、本事象を解消することができました。
 

【まとめ】本エラーの解決方法は3つある


いかがでしたでしょうか?

上記で紹介した「encoding=’utf-8’を指定」「CP932への変換に失敗した文字を削除」「CP932への変換に失敗した文字を無視」ことで、「UnicodeEncodeError: ‘cp932’ codec can’t encode characterのエラー」を解消できます。

最後にもう一度内容を確認しましょう。
 

【UnicodeEncodeError: ‘cp932’ codec can’tのエラーの原因と解決方法】
・原因
 WindowsがCP932の文字コードに自動変換するため
・解決方法は3つ
 1つ目:ファイル入出力の場合はencoding=’utf-8’を指定
 2つ目:replace関数を使用
 3つ目:encode関数を使用



本ブログでは、「業務の時短化に繋がるIT技術」や「クラウドやOSSの学び方」などを発信しています。定期的に更新していますので、ぜひブックマークをよろしくお願いいたします。

>> IT技術やその学び方を発信しているサイト「駆け出し物語」(本ブログ)
 


 

コメント

タイトルとURLをコピーしました