🔍 概要
Cursorを使ってPythonとPowerShellを連携させるプロジェクトを開発していると、
ターミナル上の出力(特に日本語)が文字化けして読めなくなる現象が発生することがあります。
この問題は特に、PowerShellの出力結果をPythonが読み取る処理や、エラーメッセージ表示時に起きやすく、
「文字が変な記号や意味不明なアルファベットに置き換わる」といった状態になります。
本記事ではこの文字化けの原因と対策、そして「なぜ今でもShift-JISが使われているのか」について解説します。
❗ 問題の発生状況
- PythonスクリプトでPowerShellを起動し、結果をターミナルに表示
- 日本語を含む出力がターミナル上で文字化け
- 出力が「コメンド」のように意味不明になる
- 特にWindows環境で発生しやすい
原因は、PowerShellの出力が「Shift-JIS(CP932)」という昔ながらの文字コードでエンコードされているのに対し、
PythonやCursorは「UTF-8」を前提としてデータを扱っているため、文字コードの不一致が起きていることです。
✅ 解決方法
対策①: PowerShell起動時にエンコーディングを明示
pwsh -NoProfile -OutputEncoding UTF8 -InputEncoding UTF8
この指定を加えることで、PowerShell側の出力もUTF-8で統一され、Python側との不一致が解消されます。
対策②: Python側でもUTF-8を明示
open("log.txt", "r", encoding="utf-8")
また、Pythonファイルの先頭に次の記述を加えることで、明示的にUTF-8で動作させることもできます。
# -*- coding: utf-8 -*-
対策③: PowerShellのコードページを変更
PowerShell内で手動で以下を実行することでも、ターミナルの出力エンコードをUTF-8に変更可能です。
chcp 65001
ただし、Cursorなどの統合環境ではこの変更が無視されることもあります。
🤔 なぜ今でもShift-JISなのか?
理由1:Windowsの過去の仕様との互換性
- 長年、日本語版Windowsでは「Shift-JIS(CP932)」という文字コードが使われてきた
- 業務システムや古いアプリがこの文字コードに依存しており、UTF-8にすると不具合が出る場合がある
理由2:PowerShell自体の進化が遅かった
PowerShellのバージョン | デフォルトの文字コード | 補足 |
---|---|---|
PowerShell 5.1以前 | Shift-JIS(CP932) | 完全に古い仕様。Windows内蔵。 |
PowerShell 7以降 | UTF-8(原則) | Linux互換や国際化のため改善。ただし完全ではない。 |
📝 永続化するには?
起動オプション -OutputEncoding UTF8
は毎回指定しなければ効果がありません。以下の方法で補完できます。
方法1:Cursorの設定でPowerShell起動コマンドを変更(可能な場合)
方法2:起動ラッパースクリプトを用意する
Start-Process pwsh -ArgumentList "-NoProfile -OutputEncoding UTF8 -InputEncoding UTF8"
方法3:PowerShellのプロファイルスクリプト($PROFILE)に設定を記述(非推奨)
$OutputEncoding = [System.Text.Encoding]::UTF8
ただし、Cursorなどが
-NoProfile
を使っている場合は無効になる可能性があります。
✅ まとめ
問題 | 解決策 |
---|---|
出力が文字化けする | PowerShell起動時にUTF-8指定 |
PythonとPowerShellで文字コードが違う | 両方でUTF-8を明示 |
永続化ができない | ラッパースクリプトやCursor設定で補完 |
なぜShift-JIS? | 過去の資産・業務システムとの互換性維持のため |
🚀 おわりに
この問題は、表面的には「ちょっとした文字化け」に見えても、放置するとログが読めない・エラー原因がわからないなど、
開発効率に大きく影響します。PowerShellとPythonを連携させる開発を行う場合は、エンコーディングの明示を徹底することが重要です。