UnicodeEncodeError: 'cp932' codec can't encode character の対処

結論を先に。これはWindowsのPythonが、出力やファイル書き込みの文字コードを既定の cp932(Shift_JIS)で処理しようとし、そこに含められない文字(絵文字や一部の漢字など)があって失敗している状態です。書き込み時に encoding=“utf-8” を明示すれば直ります。

UnicodeEncodeError: 'cp932' codec can't encode character '\uXXXX' in position N: illegal multibyte sequence

原因

Windowsでは、ファイルを開くときや print の出力先の既定エンコーディングが cp932 になりがちです。cp932 は日本語を扱えますが、絵文字や一部の記号・異体字は表現できません。その文字を書こうとした瞬間にこのエラーになります。

対処

  1. ファイルを開くときは encoding を必ず指定する。これが最も確実です。
with open("out.txt", "w", encoding="utf-8") as f:
f.write(text)
  1. print がコンソールで落ちる場合は、標準出力をUTF-8に切り替える。
import sys
sys.stdout.reconfigure(encoding="utf-8")
  1. スクリプト全体をUTF-8で動かしたいなら、環境変数で既定を変える(Python 3.7以降のUTF-8モード)。
Terminal window
set PYTHONUTF8=1

まとめ

  • 原因は出力先の既定が cp932 で、絵文字などを表現できないこと
  • open には encoding=“utf-8” を必ず付ける
  • print が落ちるなら sys.stdout.reconfigure(encoding=“utf-8”)
  • 恒久対応は PYTHONUTF8=1 でUTF-8モードにする