Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away