LoginSignup
33
59

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-06

はじめに

先日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

準備するもの

  1. TEXT(CSV)ファイル4種類
    • UTF-8(BOMなし)
    • UTF-8(BOMあり)
    • UTF-16(BOMなし)
    • UTF-16(BOMあり)
  2. Sakuraエディタ ※文字コード確認に使用

1. Set-Contentを使う方法

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

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

image

image

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)でファイルが作成されてしまうので注意が必要です。

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
にソースコードとファイルを格納してあります。

参考URL

テキストファイルの入出力と文字コード
Unicode ~UTF-8、UTF-16との違い~
FileSystem の Get-Content

33
59
1

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
33
59