Powershellでファイルの文字コードを変換

#はじめに
先日Office365の情報をPowershellで取得しCSVファイルで保存したのですが、文字コードがUTF-16になってしまい、EXCELで開こうとしてもうまくCSVとして認識されなかったため、Windows標準機能で簡単に文字コードを変換する方法がないか調べてみました。

※UTF-8のCSVファイルはダブルクリックでファイルを開くだけでデータがセルに分離されますが、UTF-16の場合は1行が１つのセルに入ってしまいますので不便です。インポート機能を使えば文字コードを指定してCSVファイル読み込みデータをセルに分離できますが面倒なので、、

#動作確認環境
OS:Window 10 (Windows 7 も少し確認済）
Powershell Version:5.1.14393.206

#準備するもの
1. TEXT(CSV)ファイル４種類
    - UTF-8(BOMなし)
    - UTF-8(BOMあり)
    - UTF-16(BOMなし)
    - UTF-16(BOMあり)
2. [Sakuraエディタ](http://sakura-editor.sourceforge.net/index.html.ja)　※文字コード確認に使用

#1. Set-Contentを使う方法
inputフォルダに上記4種類のファイルを格納し、以下のスクリプトを実行します。
スクリプト内では、UTF-8とUTF-16のファイルをSJISに変換するパターンと、UTF-8とUTF-16を相互に変換するパターンを実装しています。

```ps1:JPCodeConvert.ps1
#
# Using Set-Content
#

#UTF8/UTF16 to SJIS (Default)
get-content -Encoding UTF8 .\input\UTF8_NoBOM.csv | Set-Content .\output_sc\SJIS_From_UTF8_NoBOM.csv
get-content -Encoding UTF8 .\input.\UTF8_BOM.csv | Set-Content .\output_sc\SJIS_From_UTF8_BOM.csv
get-content -Encoding Unicode .\input.\UTF16_NoBOM.csv | Set-Content .\output_sc\SJIS_From_UTF16_NoBOM.csv
get-content -Encoding Unicode .\input.\UTF16_BOM.csv | Set-Content .\output_sc\SJIS_From_UTF16_BOM.csv

#UTF8/UTF16 to UTF16/UTF8
get-content -Encoding UTF8 .\input\UTF8_NoBOM.csv | Set-Content -Encoding Unicode .\output_sc\UTF16_From_UTF8_NoBOM.csv
get-content -Encoding UTF8 .\input.\UTF8_BOM.csv | Set-Content -Encoding Unicode .\output_sc\UTF16_From_UTF8_BOM.csv
get-content -Encoding Unicode .\input.\UTF16_NoBOM.csv | Set-Content -Encoding UTF8 .\output_sc\UTF8_From_UTF16_NoBOM.csv
get-content -Encoding Unicode .\input.\UTF16_BOM.csv | Set-Content -Encoding UTF8 .\output_sc\UTF8_From_UTF16_BOM.csv
```

スクリプトを実行。
`PS C:\dev\powershell> .\JPCodeConvert.ps1`

output_scフォルダに8ファイルが作成されますが、実際には3タイプのファイルが作成されます。
- SJISのファイル
- UTF-8(BOMあり)
- UTF-16(BOMあり）

以下Sakuraエディタで確認した際のスクリーンショットです。

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/fd92d2cc-3ed2-89cf-139e-8d06b212283e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/e8d9e453-80c6-b831-87e0-73952fc5858e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/131481/372a9930-650f-463c-5ae1-d0bd891068b5.png)


SJISの場合はBOMという概念はありません。
また、Set-ContentでUTF-8、Unicode(UTF-16)のEncoding指定をすると元ファイルにBOMがなくても、BOMありでファイルが出力されるようです。

#2. Out-Fileを使う方法
Set-Contentを使用した場合と同様にOut-Fileを使用してスクリプトを作成してみました。
SJISで出力するときのOut-Fileは <font color="red">-Encoding default</font>オプションを設定しないとUnicode(UTF-16)でファイルが作成されてしまうので注意が必要です。

```ps1:JPCodeConvert.ps1
#
#Using Out-File
#

#UTF8/UTF16 to SJIS (Default)
get-content -Encoding UTF8 .\input\UTF8_NoBOM.csv | Out-File -Encoding default .\output_of\SJIS_From_UTF8_NoBOM_.csv
get-content -Encoding UTF8 .\input.\UTF8_BOM.csv | Out-File -Encoding default .\output_of\SJIS_From_UTF8_BOM.csv
get-content -Encoding Unicode .\input.\UTF16_NoBOM.csv | Out-File -Encoding default .\output_of\SJIS_From_UTF16_NoBOM.csv
get-content -Encoding Unicode .\input.\UTF16_BOM.csv | Out-File -Encoding default .\output_of\SJIS_From_UTF16_BOM.csv

#UTF8/UTF16 to UTF16/UTF8
get-content -Encoding UTF8 .\input\UTF8_NoBOM.csv | Out-File -Encoding Unicode .\output_of\UTF16_From_UTF8_NoBOM.csv
get-content -Encoding UTF8 .\input.\UTF8_BOM.csv | Out-File -Encoding Unicode .\output_of\UTF16_From_UTF8_BOM.csv
get-content -Encoding Unicode .\input.\UTF16_NoBOM.csv | Out-File -Encoding UTF8 .\output_of\UTF8_From_UTF16_NoBOM.csv
get-content -Encoding Unicode .\input.\UTF16_BOM.csv | Out-File -Encoding UTF8 .\output_of\UTF8_From_UTF16_BOM.csv
```

結果はSet-Contentを使用した場合と同じです。

#3.GitHub
[https://github.com/tworks55/JPConvertByPS](https://github.com/tworks55/JPConvertByPS)
にソースコードとファイルを格納してあります。

#参考URL
[テキストファイルの入出力と文字コード](
http://yanor.net/wiki/?PowerShell%2F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%93%8D%E4%BD%9C%2F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%85%A5%E5%87%BA%E5%8A%9B%E3%81%A8%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89)
[Unicode ～UTF-8、UTF-16との違い～](http://una.soragoto.net/topics/9.html)
[FileSystem の Get-Content](https://technet.microsoft.com/ja-jp/library/hh847788.aspx?f=255&MSPPError=-2147217396)