LoginSignup
1
3

More than 1 year has passed since last update.

SJISと決別し、デフォルトでBOMなしUTF-8を扱えるようにするPowerShell設定

Last updated at Posted at 2022-01-04

はじめに

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

設定方法

起動時に設定を読み込めるようにする

デフォルトでは、設定ファイルが読み込まれないため、「実行ポリシー」を変更しておきます。

設定ファイルを編集する

編集準備

  • $profileで設定ファイルのパスを確認
  • test-path $profileで既存のファイルを確認。Falseなら次を実行
  • new-item -path $profile -itemtype file -force
  • notepad $profile

参考:PowerShellのエンコードをUTF8に変更する

設定ファイルの中身 (★これがポイント★)

以下を追記して保存。

Microsoft.PowerShell_profile.ps1
$PSDefaultParameterValues['*:Encoding'] = 'utf8'

設定の有効化

  • 編集後に起動したコンソールから、上記の設定が有効になります。
  • ドットコマンドでソースすると、すぐに設定が反映されます。
  • . $profile (ドットの次にスペースが必要です)

終わりに

この設定だけでは、出力がBOM付きになります。それが問題になる場合は「PowerShell Core」をインストールする必要があるようです。
最近のIDEはPowerShellのコンソールを使うので、環境整備の必要性を感じて試行錯誤してみました。現時点では問題なく使えていますが、副作用があるかどうかは、まだわかっていません。まだPowerShellには慣れていないので、IDE以外では当面の間のBOMなしUTF-8のテキスト処理は、cmd + WSLがメインになると思います。

追記

PowerShellからwslに渡すためには、次の一行も追加しておくと便利です。

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

詳細は、以下の記事を参考にしてください。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3