はじめに
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
詳細は、以下の記事を参考にしてください。