Visual Studio CodeでPowerShellスクリプトが文字化けする時の対処法

Windowsでの開発
PowerShell Digital Art / Microsoft

こんにちは。不可思議絵の具です。

  • Visual Studio Code(以降VSCode)で、漢字入りのPowerShellスクリプトを実行すると文字化けが原因で実行時エラー発生
  • スクリプトの文字コードを「UTF-8 with BOM」に切り替えて解決した

という記録です。

スポンサーリンク

現象

  • VSCodeで
  • 漢字を含むPowerShellスクリプトを実行すると、
  • 文字化けが原因の文法エラーが発生する

こういう箇所👇が原因で、

こういうエラー👇が発生する

環境

記事の内容は下記環境を前提にしています。

OSWindows 10 Pro Ver. 20H2
VSCode1.52.1
PowerShell7.1.1

原因

【PowerShell】と【VSCode】でデフォルト文字コードが違うため。

  • 【PowerShell】は下記4種の文字コードを自動認識する
    1. Shift-JIS
    2. UTF-8(BOM有り
    3. UTF-16 LE
    4. UTF-16 BE
  • 一方、【VSCode】のファイル保存のデフォルトは
    1. 「UTF-8(BOM無し)」
  • そのため、PowerShellで正しく解釈できず、文字化けが発生する

対策

対処法としては

  1. スクリプトを「UTF-8(BOM有り)」で保存し直す
    (スクリプト側をPowerShellに合わせる)
  2. VSCodeのデフォルト文字コードを「UTF-8(BOM有り)」に変更
    (スクリプト側をPowerShellに合わせる)
  3. PowerShell側のデフォルト文字コードを「UTF-8(BOM有り)」に変更
    (PowerShell側をスクリプトに合わせる)

の3パターンがありますが、デフォルト値を変更する②、③は好ましくないと判断。

①で対応しました。
(②、③も一応紹介します)

また、①、②においては文字コードを「Shift-JIS」にしても良いと思いますが、様々な環境で文字コードがUTFに統一されつつある昨今では、積極的に選ぶ必要はないのかな、と思います。

①スクリプトを「UTF-8(BOM有り)」で保存し直す

私の場合、たかだか数ファイルだったので、VSCodeで文字コードを「UTF-8(BOM有り)」に変更して保存し直しました。
(ファイルが大量な場合は【nkf】などの変換ツールで一括変換すれば良いでしょう)

手順は下記の通りです。

  1. 画面右下の「UTF-8」をクリック
    (全体)
    画面右下の「UTF-8」をクリック
    (拡大)
    画面右下の「UTF-8」をクリック(拡大図)
  2. 『アクションの選択』で「Save with Encoding(エンコード付きで保存)」を選択
    『アクションの選択』で「Save with Encoding(エンコード付きで保存)」を選択
  3. 続いて「UTF-8 with BOM」を選択
    「UTF-8 with BOM」を選択
  4. 画面右下の文字コードインジケーターが「UTF-8 with BOM」になったことを確認
    画面右下の文字コードインジケーターが「UTF-8 with BOM」になったことを確認

②(参考)VSCodeのデフォルト文字コードを変更

VSCodeのデフォルト文字コードを「UTF-8(BOM有り)」や「Shift-JIS」に変更する方法です。

デフォルト値を変えるのはオススメしません。

詳細はこちら(タップして表示)
  1. Ctrl + , で設定画面を表示
  2. 検索バーで files.encoding を検索
  3. 『UTF-8 with BOM』を選択

【ワークスペース】で設定すると、影響範囲をプロジェクト単位に限定できる?

③(参考)PowerShellのデフォルト文字コードを変更

PowerShellの文字コードを「UTF-8(BOM有り)」に変更する方法です。

デフォルト値を変えるのはオススメしません。

詳細はこちら(タップして表示)

参考にしたスレッド】によると、PowerShell起動時に chcp コマンド(文字コード変更)を自動実行する方針。

  1. Ctrl + , で設定画面を表示
  2. 検索バーで terminal.integrated.shellArgs.windows を検索
  3. 『settings.json で編集』をクリック
  4. "terminal.integrated.shellArgs.windows": ["-NoExit","chcp 65001"] を指定
    (初期値:null

参考 chcpコマンドの説明 (Microsoft)

参考 コードページ一覧表 (Microsoft)
chcpコマンドの説明書にないコードも載っている

 

・・・なのですが、PowerShellプラグインを入れている場合、上手く行きません

PowerShellプラグイン入りでVSCodeを起動すると、

  1. システム標準のPowerShell
  2. 最新バージョンのPowerShell

の順にPowerShellが起動するため、①では前記の設定が活きますが、②では反映されないのです。

たぶん profile.ps1 を作り

chcp 65001

を記述すれば良いのだと思いますが、これ以上の深入りは無意味と感じたので、検証はしていません。

参考 プロファイルの作り方

さいごに

下記記事を参考にさせていただきました。

Attention Required! | Cloudflare

👆C++での例だが、歴史的な変遷にも触れていて示唆に富んでいる

VS CodeでPowerShellファイルを作成・実行したら文字化けした - メモ的な思考的な
今までPowerShellはPowerShell ISEを使って書いていたのですが、以下の記事を読んで、Visual Studio Codeで書いてみました。 VS Code での PowerShell サポートが強化されました - tech.guitarrapc.cóm Hello world的な "Hello wo...

👆なぜ、「『UTF-8(BOM有り)』が無難なのか」がまとめられている

 

以上です。では(^O^)/

タイトルとURLをコピーしました