Masayan tech blog.

  1. ブログ記事一覧>
  2. Python print 文字化け解決法|Windows/Mac対応の5つの対処法

Python print 文字化け解決法|Windows/Mac対応の5つの対処法

公開日
最終更新日

文字化けが発生する原因

Python のprint文で文字化けが起こる主な原因は、標準出力のエンコーディングターミナルのエンコーディングの不一致である。

発生しやすい環境

環境

デフォルトエンコーディング

文字化けリスク

Windows

CP932(Shift-JIS系)

高い

Mac/Linux

UTF-8

低い

IDE(VS Code等)

設定による

文字化けの例

print("こんにちは、世界!")
# Windowsでの出力例: ���������A���E���I

根本原因:

  • Windows のコマンドプロンプトはデフォルトで CP932(Shift-JIS系)
  • Python 3 の内部文字列は UTF-8
  • エンコーディング不一致により文字化けが発生

対処法1: 標準出力のエンコーディング指定【推奨】

最も確実な方法は、プログラムの冒頭で標準出力を UTF-8 に設定することである。

コード例

import io
import sys

# 標準出力と標準エラー出力をUTF-8に設定
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# 正常に出力される
print("こんにちは、世界!")
print("文字化けしない 🎉")

メリット・デメリット

メリット

デメリット

✅ 確実に動作する

❌ 毎回コードに記述が必要

✅ 環境に依存しない

❌ コードが冗長になる

✅ 他の環境でも動作

応用: 関数化して再利用

def setup_utf8_output():
    """標準出力をUTF-8に設定する"""
    import io
    import sys
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# 各スクリプトの冒頭で呼び出す
setup_utf8_output()
print("こんにちは!")

対処法2: 環境変数PYTHONIOENCODINGの設定

環境変数を設定することで、Python 実行時のデフォルトエンコーディングを変更できる。

Windows での設定

一時的な設定(コマンドプロンプト)

set PYTHONIOENCODING=utf-8
python your_script.py

恒久的な設定(システム環境変数)

  1. Win + Rsysdm.cpl と入力
  2. 「詳細設定」タブ → 「環境変数」をクリック
  3. 「システム環境変数」で「新規」をクリック
  4. 変数名: PYTHONIOENCODING、値: utf-8 を入力
  5. OKで保存し、ターミナルを再起動

Mac/Linux での設定

一時的な設定

export PYTHONIOENCODING=utf-8
python your_script.py

恒久的な設定(.bashrc または .zshrc)

# ~/.bashrc または ~/.zshrc に追加
echo 'export PYTHONIOENCODING=utf-8' >> ~/.bashrc
source ~/.bashrc

メリット・デメリット

メリット

デメリット

✅ コードを変更不要

❌ 環境設定が必要

✅ すべてのスクリプトに適用

❌ 他のPCでは設定が必要

✅ 一度設定すれば永続

対処法3: ファイル出力時の明示的指定

ファイルへの書き込み時は、encoding パラメータで明示的に指定する。

コード例

# ファイル書き込み時にUTF-8を指定
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write("こんにちは、世界!\n")
    f.write("文字化けしない 🎉\n")

# ファイル読み込み時も同様
with open('output.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

BOM(Byte Order Mark)付きUTF-8

Excel などで開く場合は、BOM付きUTF-8が必要な場合がある:

with open('output.txt', 'w', encoding='utf-8-sig') as f:
    f.write("こんにちは、世界!\n")

対処法4: chcp コマンド(Windows限定)

Windows コマンドプロンプトのコードページを UTF-8 に変更する方法である。

コード例

REM コードページを UTF-8 (65001) に変更
chcp 65001

REM Pythonスクリプトを実行
python your_script.py

バッチファイル化

@echo off
chcp 65001 > nul
python %1

上記を run_utf8.bat として保存し、以下のように実行:

run_utf8.bat your_script.py

メリット・デメリット

メリット

デメリット

✅ 手軽に設定変更可能

❌ Windows限定

✅ 他のプログラムにも適用

❌ ターミナルを閉じると元に戻る

対処法5: IDE・エディタの設定確認

VS Code、PyCharm などのIDEでは、ターミナルのエンコーディング設定を確認する。

VS Code の設定

settings.json に以下を追加:

{
  "terminal.integrated.env.windows": {
    "PYTHONIOENCODING": "utf-8"
  },
  "files.encoding": "utf8"
}

PyCharm の設定

  1. FileSettingsEditorFile Encodings
  2. Project EncodingUTF-8 に設定
  3. Default encoding for properties filesUTF-8 に設定

環境別の推奨設定

Windows ユーザー向け

推奨度順:

  1. 環境変数 PYTHONIOENCODING=utf-8 を設定(恒久的)
  2. スクリプト冒頭で sys.stdout を設定(確実)
  3. IDE設定で UTF-8 を指定

Mac/Linux ユーザー向け

通常は文字化けしにくいが、念のため以下を推奨する:

  1. .bashrc/.zshrcexport PYTHONIOENCODING=utf-8
  2. ファイル入出力時は必ず encoding='utf-8' を指定

チーム開発・共有スクリプト

# スクリプト冒頭に必ず記述
# -*- coding: utf-8 -*-
import io
import sys

# 環境に依存しない設定
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

よくある質問(FAQ)

Q1: Python 2 ではどうすればいいか?

A: Python 2 は既にサポート終了しているため、Python 3 への移行を推奨する。どうしても必要な場合:

# Python 2.x
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"こんにちは"

Q2: UnicodeEncodeError が出る

A: エンコーディングが不一致である。以下を確認:

import sys
print(sys.stdout.encoding)  # 現在のエンコーディングを確認

UTF-8以外が表示される場合、対処法1または2を実施すること。

Q3: Docker コンテナ内で文字化けする

A: Dockerfile に環境変数を追加:

ENV PYTHONIOENCODING=utf-8
ENV LANG=ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8

Q4: ログファイルが文字化けする

A: logging モジュール使用時も encoding を指定:

import logging

logging.basicConfig(
    filename='app.log',
    encoding='utf-8',  # Python 3.9+
    level=logging.INFO
)

# Python 3.8以前の場合
# logging.basicConfig(
#     handlers=[
#         logging.FileHandler('app.log', encoding='utf-8')
#     ],
#     level=logging.INFO
# )

Q5: UTF-8 設定後も文字化けする

A: ターミナルのフォント設定を確認すること。日本語対応フォント(例: Noto Sans CJK、Yu Gothic等)が必要である。

トラブルシューティング

エラー1: AttributeError: 'NoneType' object has no attribute 'buffer'

原因: 実行環境に標準出力がない(一部のIDEやサービス)

解決法:

import io
import sys

if sys.stdout is not None and hasattr(sys.stdout, 'buffer'):
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

エラー2: LookupError: unknown encoding: utf-8-sig

原因: 古いPythonバージョン

解決法: Python 3.6 以降にアップデート

エラー3: 一部の文字だけ文字化けする

原因: 使用している文字が UTF-8 に含まれない(機種依存文字等)

解決法: Unicode 正規化を実施

import unicodedata

text = "㈱東京①"
normalized = unicodedata.normalize('NFKC', text)
print(normalized)  # "株式会社東京1"

まとめ

Python の print 文で文字化けが発生した場合の対処法を5つ紹介した。

推奨する対処法(環境別)

環境

推奨方法

Windows 開発環境

環境変数 PYTHONIOENCODING=utf-8 を設定

スクリプト配布

コード冒頭で sys.stdout を UTF-8 に設定

Mac/Linux

.bashrc に環境変数を追加

チーム開発

コードに設定を含め、環境依存を排除

重要ポイント

  1. 原因は エンコーディングの不一致
  2. 環境変数設定が最も手軽(Windows ユーザー)
  3. コード内設定が最も確実(環境に依存しない)
  4. ファイル入出力時は必ず encoding を指定

これらの対処法を実践すれば、Python の文字化け問題は確実に解決できる。