- Python
UnicodeEncodeError: ‘cp932’の直し方|Python
UnicodeEncodeError: 'cp932' codec can't encode character '\U0001f363' in position 5: illegal multibyte sequence は、cp932(Windows の日本語の文字コード)で表せない文字を、cp932 で書き出そうとしたときのエラーです。 絵文字・𠮷(つちよし)・é などが原因になります。
エラー文の '\U0001f363' が、書けなかった文字です。print('\U0001f363') で表示すると、どの文字か分かります(この例は 🍣)。
| どこで出たか | 直し方 |
|---|---|
print(出力をファイルにリダイレクト・タスクスケジューラ・一部の IDE) |
PYTHONUTF8=1 で UTF-8 にする、または sys.stdout.reconfigure(...) |
open(..., 'w') でファイルに書く |
encoding='utf-8' を指定する |
df.to_csv(..., encoding='cp932')(Excel 向けの CSV) |
encoding='utf-8-sig' にする |
| どうしても cp932 で書く(取引先の指定など) | errors='replace' など。書けない文字が ? になることを決めて使う |
確認環境:Python 3.11・pandas 3.0。Windows の cp932 の出力は、PYTHONIOENCODING=cp932 と encoding='cp932' の指定で再現しました(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「UnicodeEncodeError: 'cp932'の直し方|Python」
cp932 で書けない文字
確認環境で、文字ごとに cp932 と shift_jis で書けるかを試しました。
| 文字 | 例 | cp932 | shift_jis |
|---|---|---|---|
| 絵文字 | 🍣(U+1F363) | 書けない | 書けない |
| JIS 第3・第4水準の漢字 | 𠮷(U+20BB7) | 書けない | 書けない |
| アクセント付きの文字 | é(U+00E9) | 書けない | 書けない |
| ダッシュ | —(U+2014) | 書けない | 書けない |
| ノーブレークスペース | U+00A0 | 書けない | 書けない |
| Windows の拡張文字 | ①・髙・~(U+FF5E)・-(U+FF0D) | 書ける | 書けない |
| 半角カナ | カ | 書ける | 書ける |
encoding='shift_jis' を指定すると、① や 髙(はしごだか)も書けません。 Windows の日本語の文字(丸数字・はしごだかなど)を含むデータは、shift_jis ではなく cp932 を指定します。それでも、絵文字や 𠮷 は書けません。
書けても、別の文字に変わるものがある
| 書いた文字 | cp932 で保存して読み直した文字 |
|---|---|
| 〜(U+301C 波ダッシュ) | ~(U+FF5E 全角チルダ) |
| −(U+2212 マイナス記号) | -(U+FF0D 全角ハイフンマイナス) |
| ‖(U+2016) | ∥(U+2225) |
| ¢・£・¬ | ¢・£・¬(全角) |
エラーにはならず、読み直すと別の文字(見た目は似ている)になりました。 読み直した文字列で検索・比較すると一致しなくなります。この問題の詳細は、関連記事の「「~」が「?」になる原因と直し方|波ダッシュ問題」で扱っています。
print で出るとき
(標準出力が cp932 のとき)
>>> print('合計 🍣 100円')
UnicodeEncodeError: 'cp932' codec can't encode character '\U0001f363' in position 3: illegal multibyte sequence
Python 3.6 以降の Windows では、コンソールに直接表示するときは Unicode の API が使われ、このエラーは起きにくくなりました。ただし、出力をファイルにリダイレクトしたとき(python app.py > log.txt)は、以前の文字コードのままです(PEP 528)。タスクスケジューラや、一部の IDE・CI での実行も、リダイレクトに当たることがあります。
| 直し方 | 書き方 | 結果(確認環境) |
|---|---|---|
| UTF-8 モードにする | 環境変数 PYTHONUTF8=1、または python -X utf8 app.py |
標準出力が utf-8 になった |
| 書けない文字を置き換える | PYTHONIOENCODING=cp932:replace |
合計 ? 100円 |
| プログラムの中で変える | sys.stdout.reconfigure(errors='backslashreplace') |
合計 \U0001f363 |
PYTHONUTF8=1 は、print・open など Python 全体の既定の文字コードを UTF-8 にします。 ログを UTF-8 で読めるなら、これが一番手軽です。
open でファイルに書くとき
with open('out.txt', 'w') as f: # encoding を書いていない
f.write('髙橋 𠮷野家\n')
encoding を書かないと、UTF-8 モードでない限り、OS の文字コード(日本語の Windows なら cp932)が使われます(Python の公式ドキュメント)。同じコードが、Mac・Linux では動き、Windows だけで止まります。
UnicodeEncodeError: 'cp932' codec can't encode character '\U00020bb7' in position 3: illegal multibyte sequence
確認環境では、エラーになったファイルは 0 バイトでした(1行目の途中で止まったため、何も書かれなかった)。途中まで書けたように見えて、実は空、ということがあります。
with open('out.txt', 'w', encoding='utf-8') as f: # 必ず encoding を書く
f.write('髙橋 𠮷野家\n')
Python 3.15 では、encoding を書かないときの既定が UTF-8 に変わりました(PEP 686、公式ドキュメント)。それより前の版で動かす可能性があるなら、encoding='utf-8' を明示しておきます。
pandas の to_csv(Excel で開く CSV)
>>> df.to_csv('p.csv', encoding='cp932', index=False)
UnicodeEncodeError: 'cp932' codec can't encode character '\U00020bb7' in position 0: illegal multibyte sequence
「Excel で文字化けしないように cp932 で書く」と、𠮷 などで止まります。 Excel で開く CSV は、utf-8-sig(BOM 付きの UTF-8)で書くと、文字を失わずに済みます。
| 書き方 | 結果(確認環境) |
|---|---|
encoding='utf-8-sig' |
すべての文字を保存。先頭に BOM(EF BB BF)が付く |
encoding='cp932' |
𠮷 でエラー |
encoding='cp932', errors='replace' |
髙橋,① は残り、𠮷田 は ?田、— は ? |
errors='replace' は、エラーにはなりませんが、氏名の一部が ? に変わります。 取引先のシステムが cp932 しか読めない場合など、どうしても cp932 で渡すときだけ使い、どの行の何が置き換わったかを記録しておきます。
errors の種類と結果
'佐藤 様 🍣 注文' を cp932 で書いたときの結果です。
| errors | 結果 |
|---|---|
'strict'(既定) |
UnicodeEncodeError |
'replace' |
佐藤 様 ? 注文 |
'ignore' |
佐藤 様 注文(黙って消える) |
'xmlcharrefreplace' |
佐藤 様 🍣 注文(HTML なら元の文字で表示される) |
'backslashreplace' |
佐藤 様 \U0001f363 注文 |
'namereplace' |
佐藤 様 \N{SUSHI} 注文 |
'ignore' は文字が消えたことに気づけないので、データの書き出しでは避けます。 ログなら 'backslashreplace' にすると、どの文字だったかを後で確かめられます。
書けない文字を、先に探す
def cp932_ng(text):
return [(i, ch, f'U+{ord(ch):04X}') for i, ch in enumerate(text)
if not _can(ch)]
def _can(ch):
try:
ch.encode('cp932'); return True
except UnicodeEncodeError:
return False
cp932_ng('𠮷田 🍣 é') # [(0, '𠮷', 'U+20BB7'), (3, '🍣', 'U+1F363'), (5, 'é', 'U+00E9')]
cp932 で渡す必要があるデータは、書き出す前に、書けない文字がある行を一覧にします。 置き換えるか、相手と相談するかを、行ごとに決められます。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | どの文字か | エラー文の '\U...' を print |
| 2 | どこで書いているか | print・open・to_csv・ログ |
| 3 | UTF-8 にできるか | encoding='utf-8'、Excel 向けは utf-8-sig、PYTHONUTF8=1 |
| 4 | cp932 が必須か | 書けない文字を先に探し、置き換えのルールを決める |
| 5 | shift_jis を指定していないか | ①・髙 を含むなら cp932 |
| 6 | 読み直して比べるか | 〜・− などは別の文字に変わる |
よくある質問
Q. 読み込むときのエラー(UnicodeDecodeError)とは違いますか。 A. 違います。Encode は書き出すとき、Decode は読み込むときのエラーです。読み込みのエラーは、関連記事の「UnicodeDecodeErrorの原因と直し方|cp932・utf-8・BOM」で扱っています。
まとめ
- cp932 で表せない文字(絵文字・𠮷・é・— など)を書き出したエラー
- shift_jis では ①・髙 も書けない。Windows の文字を含むなら cp932
- print はリダイレクトしたときに出る。
PYTHONUTF8=1が手軽 - open は
encoding='utf-8'を必ず書く(3.15 からは既定が UTF-8) - Excel 向けの CSV は
utf-8-sig。cp932 のerrors='replace'は文字が?になる - 〜・− などは、cp932 で保存すると別の文字に変わる
参考・出典
確認日はいずれも 2026年10月11日です。
- Python ドキュメント「Built-in Functions」(open):https://docs.python.org/3/library/functions.html#open
- PEP 528「Change Windows console encoding to UTF-8」:https://peps.python.org/pep-0528/
- PEP 686「Make UTF-8 mode default」:https://peps.python.org/pep-0686/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「UnicodeEncodeError: 'cp932'の直し方|Python」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。