このページの本文へ

前へ 1 2 次へ

Windows Info 第383回

PowerShellで外部コマンドの出力が文字化けする場合の対処法

2023年06月11日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

PowerShellで文字化けが生じる場合がある

 直接実行すると問題なく表示されるのに、PowerShellの変数に格納する、あるいはファイルに出力すると文字化けする外部コマンドがある。

一部の外部コマンドには、出力をリダイレクトしたとき、あるいはPowerShellの変数に格納すると、文字化けしてしまうものがある

 具体的には、wsl.exeやwinget.exeなどだ。文字化けするのは、PowerShellの変数への格納や、cmd.exeでファイルにリダイレクトしたあと、変数やファイルを表示したときである。

 先に結論から言えば、wsl.exeとwinget.exeの場合、標準出力にはバイトマークなしのUnicode(UTF-16LE)エンコードされた文字列が出力されているため、そのままでは文字化けしてしまう。

 画面に出力したときに文字化けしない理由は、標準出力とは異なる方法で画面表示しているからだと思われる。ソースコードを調べたわけではないが、たとえば、コンソールAPIなどを使って画面出力しているのではないかと思われる。このときの表示はコンソールや文字エンコード設定に関わらず、正しくなる。

 具体的に「wsl.exe -l」の場合で見てみることにする。まずcmd.exeで

wsl.exe -l >wsl-cmd01.txt

と出力した場合、ファイルにはバイトオーダーマークがない。このためにmore.exeなどで表示すると、文字化けしてまう。

たとえばwsl.exeでは、コマンド出力を画面に表示させても問題ないのに、ファイルにリダイレクトすると文字化けしてしまう

 cmd.exeには、バイトオーダーマークなしのUnicodeを読み込む機能はないが、PowerShell Ver.7または、Windows PowerShell Ver.5.1(以下両方をPowerShellと表記する)では、

Get-Content .\wsl-cmd01.txt -Encoding Unicode

とすることで、正しくファイルを読むことは可能だ。

cmd.exeのリダイレクトで文字化けするのは、出力のエンコードがUnicode(UTF-16LE)で、バイトオーダーマークがないため。そのため、PowerShellのGet-Contentコマンドでエンコードを指定すると正しく表示できる

 PowerShellの場合は、話はもう少し複雑になる。PowerShellで外部実行ファイル(外部コマンド)の出力は、シフトJIS(日本語版Windowsの場合)であることを想定していて、コマンドの出力に対してUnicode(UTF-16LE)への文字エンコード変換をする。

 本来Unicodeなのに、それをシフトJISだと思って文字エンコード変換するため、文字エンコードが正しくないものになり、その結果文字化けしてしまう。cmd.exeの場合とは、少し事情が違う。

 PowerShellでは、外部コマンドの出力を変換して受け取るため、これをリダイレクトしてファイルに書き込んでも、誤った変換がされたファイルになる。なので、cmd.exeのようにリダイレクトしたファイルをUnicodeエンコードで読んでも正しい結果は得られない。

PowerShellでは、外部コマンドの出力を読み込むときにシフトJISからUnicodeにエンコードを変換するため、誤った変換により、文字化けが発生する。このためコマンド出力をファイルに書き込んでエンコードを指定しても正しく表示されない

PowerShellで文字エンコードを正しく処理させる

 PowerShellで、Unicode出力を正しく受け取るためには、コンソールの出力エンコードをUnicodeにする。これで、PowerShellは外部コマンドの出力がUnicodeエンコードであることを理解し、変換しなくなる。

 そのためには、一時的にコンソールの出力エンコードをUnicodeにして、コマンドの実行後に元に戻す。具体的には、

$TempMyOutputEncode=[System.Console]::OutputEncoding
[System.Console]::OutputEncoding=[System.Text.Encoding]::Unicode
$x=wsl.exe -l
[System.Console]::OutputEncoding=$TempMyOutputEncode

とする。

 最初の行は、現在の出力エンコードを変数($TempMyOutputEncode)に保存するもの。

 2行目は、[System.Console]::OutputEncodingを、Unicodeエンコード(Encodingオブジェクト)に変更している。ユニコードのEncodingは、最初からプロパティとして定義されているので、「[System.Text.Encoding]::Unicode」と指定できる。なお、シフトJISエンコードを使う場合には、以下のコマンドでエンコードを得ることができる。

[System.Text.Encoding]::GetEncoding('shift_jis')

 このGetEncodingで利用できるエンコード名については、以下のページに記述がある。これはPowerShell Ver.7.x用だが、Windows PowerShell用もページの中身はほぼ同じものである。

●Encoding クラス (System.Text) PowerShell 7.x
 https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding?view=net-7.0#list-of-encodings

 3行目がwsl.exeの実行である。ここで、標準出力にUnicodeを出力するコマンドを実行すればよい。

 4行目では、1行目で変数$TempMyOutputEncodeに保存したエンコードを使って出力エンコードを復元している。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
¥2,380
2
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,390
3
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥660
4
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
¥18,980
5
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
¥980
6
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
¥5,280
7
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ライトブラック, 1m)
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ライトブラック, 1m)
¥1,780
8
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
¥990
9
【Amazon.co.jp限定】バッファロー microSD 32GB 100MB/s UHS-1 U1 microSDHC【 Nintendo Switch 対応 】V10 A1 IPX7 Full HD RMSD-032U11HA/N
【Amazon.co.jp限定】バッファロー microSD 32GB 100MB/s UHS-1 U1 microSDHC【 Nintendo Switch 対応 】V10 A1 IPX7 Full HD RMSD-032U11HA/N
¥1,880
10
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
¥1,590

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

ASCII.jpメール デジタルMac/iPodマガジン