【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/
おわり
以上です。
この記事が気に入ったらサポートをしてみませんか?