見出し画像

【PowerShell】どう書くんだっけ?『ファイルのエンコード変更』

どうも lingmu です。
ファイル操作を行っているとエンコードを変更したい(SJISで作成されているものをUTF-8に変更したり、その逆をしたり)ことがあります。今回は PowerShell でエンコードを変更する方法を書きます。大量のファイルのエンコードをまとめて変更したり、バッチ処理などでUTF-8で作成されたファイルをSJISに変更して読み込みたいときなどに効果的です。

1. やりたいこと

 今回は、『以下2つのエンコード変更をしたい』がやりたいことと仮定します。
 (1)ファイルのエンコードを UTF-8 から SJIS へ変更する
 (2)ファイルのエンコードを SJIS から UTF-8 へ変更する

2. どう書くんだっけ?

 2.1 UTF-8 から SJIS へ変更する

 以下のコマンドを実行することでファイルのエンコードを UTF-8 から SJIS へ変更することができます。

PS C:\> Get-Content -Encoding UTF8 UTF8_File.txt | Set-Content SJIS_File.txt

 2.2 SJIS から UTF-8 へ変更する

 以下のコマンドを実行することでファイルのエンコードを SJIS から UTF-8 へ変更することができます。が、、、UTF-8 には BOM付とBOM無しがあり、PowerShell のデフォルトは BOM付となります。

PS C:\> Get-Content SJIS_File.txt | Set-Content -Encoding UTF8_File.txt

※BOM は Byte Order Mark の略で、Unicode で符号化したテキストの先頭につける数バイトのデータのことで、このデータを元に Unicode で符号化されていることおよび符号化の種類の判別が行われます。(詳細は、参考サイトの『バイト順マーク(Wikipedia)』をご参照ください)

 2.3 SJIS から UTF-8 BOM 無しへ変更する

  PowerShell のコマンドレットでは UTF-8 BOM 無しへ変更できないため、.NET の [System.IO.File]::WriteAllLines を使って SJIS から UTF-8 BOM 無しへ変更することができます。コマンドは以下のとおりです。

PS C:\> $utf8_bomless_enc = New-Object System.Text.UTF8Encoding $False; `
>> $lines = Get-Content C:\work\SJIS_Text.txt; `
>> [System.IO.File]::WriteAllLines("C:\work\UTF8_Bomless.txt", $lines, $utf8_bomless_enc)

 2.3.1 解説

 コマンド内容について簡単に解説を書きます。

 (1) System.Text.UTF8Encoding に $False を指定して UTF-8 BOM 無しのエンコードオブジェクトを生成しています。

 (2)$lines = Get-Content C:\work\SJIS_Text.txt; でファイルの内容を全て読み込み $lines に格納します。

 (3).NET の [System.IO.File]::WriteAllLines に出力先パス、(2)で読み込んだファイルの内容、(1)で生成した UTF-8 BOM 無しのエンコードオブジェクトを指定してコールすることで出力先パスにエンコード変更した内容が書き出されます。

3. 参考サイト

■バイト順マーク(Wikipedia)
 https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF

■PowerShellでBOM無しUTF8を書くサンプル
 UTF-8 BOM 無しに変換するサンプルコードが公開されています。
 https://gist.github.com/stknohg/c84b2a8b6aa02b25a327c1420b0a1695

■PowerShellのエンコードをUTF8に変更する
 PowerShell Core をインストールする方法が紹介されています。
 https://dattesar.com/powershell-utf8/

おわり

 以上です。


この記事が気に入ったらサポートをしてみませんか?