PowerShellの文字化け問題:日本語環境でのパイプラインエンコード設定と解決法
PowerShell文字化け問題:日本語環境のパイプラインエンコード設定と解決法

PowerShellのパイプライン処理において、文字エンコードの変換がユーザーに見えない形で行われ、その結果、文字化けや予期しない出力が発生することがある。この問題は特に非英語環境、とりわけ日本語環境で顕著である。本記事では、Windows 11 Ver.25H2 OSビルド26200.8655上で、PowerShell Ver.7.6.3、Windows PowerShell Ver.5.1.26100.8655、cmd.exe Ver.10.0.26100.8521を使用して検証した結果をもとに、問題の原因と解決策を解説する。

パイプラインにおける文字エンコードの仕組み

PowerShellは、外部コマンド(実行ファイルを持つコマンド)をパイプライン内で起動する際、$OutputEncoding変数で指定された文字エンコードを使用して文字列を渡す。同時に、外部コマンドの実行環境のコードページを$OutputEncodingと同じに設定する。この動作は、ファイルへの読み書きとは独立している点に注意が必要である。

外部コマンドとの情報の受け渡しには、標準入出力が使われる。このとき、文字エンコードの不一致が生じると、テキストデータが正しく解釈されず文字化けが発生する。PowerShell内部では、$OutputEncoding変数によってエンコードを制御するが、この変数に設定されたエンコーダーやコードページが実際の入出力に使用される。

Pickt横長バナー — Telegram用の共同買い物リストアプリ

エンコード設定の確認と初期値

PowerShellの実行環境には、コンソール出力と入力の文字エンコードを設定するプロパティとして、[System.Console]::OutputEncoding(以下[Console]::OutputEncoding)と[System.Console]::InputEncoding(以下[Console]::InputEncoding)が存在する。これらと$OutputEncodingの初期値を、Windows PowerShell 5.1およびPowerShell 7.6.3について表01に示す。

■表01 各環境の初期エンコード設定

  • Windows PowerShell 5.1: $OutputEncoding = ASCII, [Console]::OutputEncoding = Shift-JIS, [Console]::InputEncoding = Shift-JIS
  • PowerShell 7.6.3: $OutputEncoding = UTF-8, [Console]::OutputEncoding = Shift-JIS, [Console]::InputEncoding = Shift-JIS

コマンド出力の文字化けの多くは、これら3つの設定値の不一致に起因する。具体的には、PowerShellが出力したテキストの文字エンコードと[Console]::InputEncodingが一致しない場合に文字化けが発生する。マイクロソフトの公式ドキュメント(about_Preference_Variables)によれば、PowerShellおよびWindows PowerShellでは、$OutputEncodingと[Console]::InputEncodingの値を一致させる必要があるとされている。

日本語環境での問題点と解決策

日本語環境では、デフォルトの設定値が一致していない。筆者はテキストファイルをすべてUTF-8で統一し、シフトJISを利用しない方針を取っている。そのため、以下のように3つの設定をすべてUTF-8に変更している。

PowerShell 7.xの場合、プロファイル内で次のように設定する。

[Console]::OutputEncoding = [Console]::InputEncoding = $OutputEncoding

Windows PowerShellの場合、次のように設定する。

[Console]::OutputEncoding = [Console]::InputEncoding = $OutputEncoding = [System.Text.Encoding]::UTF8

この設定により、パイプラインを通じた外部コマンドとの文字列やり取りがUTF-8で統一され、文字化けを防止できる。なお、本記事のタイトルはケイト・マスカレナスのSF小説「時間旅行者のキャンディボックス」(創元SF文庫、原題THE PSYCHOLOGY OF TIME TRAVEL, 2018)に由来する。タイムトラベルは物理学的には難題だが、本作ではコンピュータ開発のように扱われ、時間と人間の関係に焦点が当てられている。

Pickt記事後バナー — 家族イラスト付きの共同買い物リストアプリ