PowerShellでファイル出力する時のエンコーディングについて

Windows PowerShellとクロスプラットフォームのPowerShellでファイル出力した際にエンコーディングがどうなるかまとめ。

本記事では実際にファイルを出力してどうなっているか確認してみます。

## ドキュメント

[about_Character_Encoding](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-7.3)

## 今回確認に利用するPowerShellバージョン

- Windows PowerShell 5.1.19041.2364
- PowerShell 7.3.2

## 実際にファイル出力して確認してみる

ここではWindows PowerShellとPowerShellで実際にファイルを出力して、どうなっているか確認してみます。

Windows PowerShellとPowerShellそれぞれで起動してコマンドを実施してもいいのですが、それぞれ起動するのも面倒なので下記のようにコマンドでWindows PowerShell(powershell.exe)とPowerShell(pwsh.exe)をそれぞれを呼び出して引数で実行するコマンドを渡して実行します。

```powershell

# Windows PowerShell（powershell.exeで実行）

powershell -Command "'helloworld'>C:\temp\encode\powershell-redirect.txt"

powershell -Command "'helloworld' | Out-File C:\temp\encode\powershell-out-file.txt"

powershell -Command "'helloworld' | Out-File -Encoding utf8 c:\temp\encode\powershell-out-file-utf8.txt"

# PowerShell（pwsh.exeで実行）

pwsh -Command "'helloworld'>C:\temp\encode\pwsh-redirect.txt"

pwsh -Command "'helloworld' | Out-File C:\temp\encode\pwsh-out-file.txt"

pwsh -Command "'helloworld' | Out-File -Encoding utf8 c:\temp\encode\pwsh-out-file-utf8.txt"

# pwshではエンコーディングにutf8BOMとutf8NoBOMもあるのでこれも一応確認
pwsh -Command "'helloworld' | Out-File -Encoding utf8BOM c:\temp\encode\pwsh-out-file-utf8BOM.txt"

pwsh -Command "'helloworld' | Out-File -Encoding utf8NoBOM c:\temp\encode\pwsh-out-file-utf8NoBOM.txt"

```

## 確認結果

### Windows PowerShellでリダイレクト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a191bf62-9519-1e4b-731c-3185f21c1870.png)

### Windows PowerShellでOut-File エンコード指定なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8e8826dd-92b3-f012-8727-8f78756cf99b.png)

### Windows PowerShellでOut-File エンコード utf8指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f43cb89e-0751-9766-c316-77cdacb0ce3b.png)

### PowerShellでリダイレクト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0af2d95c-d36b-bde3-2005-fd9c7c1f6d7f.png)

### PowerShellでOut-File エンコード指定なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6642f75a-a84f-05a9-3cb8-7aae27f328ba.png)

### PowerShellでOut-File エンコード utf8指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5f140255-f70f-7db5-0ca8-b88965af0f5b.png)

### PowerShellでOut-File エンコード utf8BOM指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a9de8546-8fa9-4b8c-023c-96b8d1a3c25e.png)

### PowerShellでOut-File エンコード utf8NoBOM指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/283562a2-f727-101f-8654-7b0a275922f0.png)


## まとめ

|項目|結果|
|---|---|
|Windows PowerShellでリダイレクト出力|UTF-16 LE|
|Windows PowerShellでOut-File エンコード指定なし|UTF-16 LE|
|Windows PowerShellでOut-File エンコード utf8指定|UTF-8 （BOM付き）|
|PowerShellでリダイレクト出力|UTF-8 （BOMなし）|
|PowerShellでOut-File エンコード指定なし|UTF-8 （BOMなし） |
|PowerShellでOut-File エンコード utf8指定|UTF-8 （BOMなし） |
|PowerShellでOut-File エンコード utf8BOM|UTF-8 （BOM付き）|
|PowerShellでOut-File エンコード utf8NoBOM|UTF-8 （BOMなし） |

## PowerShell

[about_Character_Encoding](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-7.3)

上記ドキュメントには

>PowerShell (v6 以降) では、すべてのテキスト出力に対して が既定で に utf8NoBOM 設定されます。

と記載がありますが、下記ページにPowerShell Coreになって変化していった変遷がわかりやすく記載があります。

参考 [PowerShell 6.0からファイル出力に関わるエンコーディングが変わります](https://blog.shibata.tech/entry/2017/11/04/215929)

## 総評

色々と互換性の事を考えるとUTF8のBOMなしで出力するのが良さそうです。

Windows PowerShellではUTF8をBOMなしで出力しようとすると、ひと手間かける必要がありますが、クロスプラットフォームなPowerShellなら何も考えずにUTF8になってくれるのは便利だと感じます。