はじめに
PowerShellでBOMなしUTF-8を扱おうとすると、-Encoding utf8を付ける必要があり、面倒でした。WSLが使えるようになってからBOMなしUTF-8のファイルを作ることが多くなったので、SJISの環境はcmdに残し、PowerShellでは思い切ってデフォルトをUTF-8にしてみました。
確認事項
👎初期状態
catでBOMなしUTF-8が文字化けします。これが問題。
PS > cat .\utf8.txt
縺薙l縺ッUTF-8縺ョ繝・く繧ケ繝医〒縺吶・
PS > cat .\utf8.txt -Encoding utf8
これはUTF-8のテキストです。
PS > cat .\utf8bom.txt
これはBOM付きUTF-8のテキストです。
PS > cat .\sjis.txt
SJISのテキストです。
👎chcp 65001でもBOMなしを正しく扱えない
Active code page: 65001
PS > cat .\utf8.txt
縺薙l縺ッUTF-8縺ョ繝・く繧ケ繝医〒縺吶・
PS > cat .\utf8.txt -Encoding utf8
これはUTF-8のテキストです。
PS > cat .\utf8bom.txt
これはBOM付きUTF-8のテキストです。
PS > cat .\sjis.txt
SJISのテキストです。
コンソール画面で日本語部分が全部□になる場合は、フォント設定をMS ゴシックなどに変更する。
参考:PowerShellでUTF-8で書かれたPHPの日本語が文字化けするときの対処法、Windows10
👍デフォルトを変更した後
PS > cat .\utf8.txt
これはUTF-8のテキストです。
PS > cat .\utf8bom.txt
これはBOM付きUTF-8のテキストです。
PS > cat .\sjis.txt
SJIS�̃e�L�X�g�ł��B
PS > cat .\sjis.txt -Encoding oem
SJISのテキストです。
PS > cat .\sjis.txt -Encoding default
SJISのテキストです。
※-Encodingに渡すパラメータのdefaultはSJISになっているようなので、注意してください。(ややこしい)
確認環境
PS > $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.1320
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1320
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
- Windows10 Home 21H1, 21H2
設定方法
起動時に設定を読み込めるようにする
デフォルトでは、設定ファイルが読み込まれないため、「実行ポリシー」を変更しておきます。
- 管理者権限でPowerShellを開く
- 実行ポリシーを変更する
- 例:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
 
- 例:
設定ファイルを編集する
編集準備
- 
$profileで設定ファイルのパスを確認
- 
test-path $profileで既存のファイルを確認。Falseなら次を実行
- new-item -path $profile -itemtype file -force
- notepad $profile
設定ファイルの中身 (★これがポイント★)
以下を追記して保存。
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
設定の有効化
- 編集後に起動したコンソールから、上記の設定が有効になります。
- ドットコマンドでソースすると、すぐに設定が反映されます。
- 
. $profile(ドットの次にスペースが必要です)
終わりに
この設定だけでは、出力がBOM付きになります。それが問題になる場合は「PowerShell Core」をインストールする必要があるようです。
最近のIDEはPowerShellのコンソールを使うので、環境整備の必要性を感じて試行錯誤してみました。現時点では問題なく使えていますが、副作用があるかどうかは、まだわかっていません。まだPowerShellには慣れていないので、IDE以外では当面の間のBOMなしUTF-8のテキスト処理は、cmd + WSLがメインになると思います。
追記
PowerShellからwslに渡すためには、次の一行も追加しておくと便利です。
$OutputEncoding = [System.Text.Encoding]::UTF8
詳細は、以下の記事を参考にしてください。
