#はじめに
先日Office365の情報をPowershellで取得しCSVファイルで保存したのですが、文字コードがUTF-16になってしまい、EXCELで開こうとしてもうまくCSVとして認識されなかったため、Windows標準機能で簡単に文字コードを変換する方法がないか調べてみました。
※UTF-8のCSVファイルはダブルクリックでファイルを開くだけでデータがセルに分離されますが、UTF-16の場合は1行が1つのセルに入ってしまいますので不便です。インポート機能を使えば文字コードを指定してCSVファイル読み込みデータをセルに分離できますが面倒なので、、
#動作確認環境
OS:Window 10 (Windows 7 も少し確認済)
Powershell Version:5.1.14393.206
#準備するもの
- TEXT(CSV)ファイル4種類
- UTF-8(BOMなし)
- UTF-8(BOMあり)
- UTF-16(BOMなし)
- UTF-16(BOMあり)
- Sakuraエディタ ※文字コード確認に使用
#1. Set-Contentを使う方法
inputフォルダに上記4種類のファイルを格納し、以下のスクリプトを実行します。
スクリプト内では、UTF-8とUTF-16のファイルをSJISに変換するパターンと、UTF-8とUTF-16を相互に変換するパターンを実装しています。
#
# 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エディタで確認した際のスクリーンショットです。
SJISの場合はBOMという概念はありません。
また、Set-ContentでUTF-8、Unicode(UTF-16)のEncoding指定をすると元ファイルにBOMがなくても、BOMありでファイルが出力されるようです。
#2. Out-Fileを使う方法
Set-Contentを使用した場合と同様にOut-Fileを使用してスクリプトを作成してみました。
SJISで出力するときのOut-Fileは -Encoding defaultオプションを設定しないとUnicode(UTF-16)でファイルが作成されてしまうので注意が必要です。
#
#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
にソースコードとファイルを格納してあります。
#参考URL
テキストファイルの入出力と文字コード
Unicode ~UTF-8、UTF-16との違い~
FileSystem の Get-Content