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

## はじめに
PowerShellでBOMなしUTF-8を扱おうとすると、`-Encoding utf8`を付ける必要があり、面倒でした。WSLが使えるようになってからBOMなしUTF-8のファイルを作ることが多くなったので、SJISの環境はcmdに残し、PowerShellでは思い切ってデフォルトをUTF-8にしてみました。

## 確認事項
### &#x1f44e;初期状態
catでBOMなしUTF-8が文字化けします。これが問題。

```
PS > cat .\utf8.txt
縺薙ｌ縺ｯUTF-8縺ｮ繝・く繧ｹ繝医〒縺吶・
PS > cat .\utf8.txt -Encoding utf8
これはUTF-8のテキストです。
PS > cat .\utf8bom.txt
これはBOM付きUTF-8のテキストです。
PS > cat .\sjis.txt
SJISのテキストです。
```

### &#x1f44e;`chcp 65001`でもBOMなしを正しく扱えない

```
Active code page: 65001
PS > cat .\utf8.txt
縺薙ｌ縺ｯ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](https://katotaks.com/powershell-utf8-mojibake/)

### &#x1f44d;デフォルトを変更した後

```
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`
        * 参考：
            * [実行ポリシーについて - PowerShell](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2)
            * [PowerShellの実行ポリシー変更](https://qiita.com/earthdiver1/items/b3f529c81f5892972a72)


### 設定ファイルを編集する
#### 編集準備
* `$profile`で設定ファイルのパスを確認
* `test-path $profile`で既存のファイルを確認。Falseなら次を実行
* `new-item -path $profile -itemtype file -force`
* `notepad $profile`

参考：[PowerShellのエンコードをUTF8に変更する
](https://dattesar.com/powershell-utf8/)

#### 設定ファイルの中身　(★これがポイント★)
以下を追記して保存。

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

* 参考：[文字エンコードについて - PowerShell | Microsoft Docs (既定のエンコードの変更)](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-5.1#changing-the-default-encoding)

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

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

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

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

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

https://qiita.com/e4rfx/items/cd162a4ad1db10e86f50