テキストファイルの入出力と文字コード
前提
PowerShellは文字列を(バイト列ではなく)文字列として認識する
PS> (echo "こんにちは").GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS tmp> (echo "こんにちは").Length
5
PowerShellの内部文字コードはUTF16
echo "こんにちは" > utf16.txt
- PowerShellの内部文字コードはUTF16(UTF16LE)。
- 従って、コマンドレットの出力をリダイレクトでファイルにすると標準ではUTF16で保存される。
日本語PowerShellのデフォルト文字コードはSJIS
- 日本語PowerShellのデフォルト文字コードはSJIS。
- 内部文字コードとデフォルト文字コードを分けて扱う。
テキストファイルの読み込み
Get-Content utf16.txt
Get-Content sjis.txt
Get-Content utf8-bom.txt
Get-Content -Encoding UTF8 utf8-nobom.txt
- テキストファイルの読み込みにはGet-Contentコマンドレットを使う。
- 日本語PowerShellの場合、Get-ContentはUTF16、SJIS、UTF8(BOMあり)のテキストファイルを読み取れる。
- それら以外のファイルを読み込むには-Encodingオプションで文字コードを指定する。
- 例えばUTF8(BOMなし)なら Get-Content -Encoding UTF8と指定する。EUC-JPやJISは指定出来ない。
- -Encoding Defaultと指定するとSJISを指定する事になる。
テキストファイルの書き出し
Get-Content -Encoding UTF8 utf8.txt | Set-Content sjis.txt
Get-Content sjis.txt | Set-Content -Encoding UTF8 utf8-bom.txt
Get-Content -Encoding UTF8 utf8.txt | Out-File utf16.txt
Get-Content -Encoding UTF8 utf8.txt | Out-File -Encoding default sjis.txt
- テキストファイルの書き出しにはSet-ContentかOut-Fileを使う。
- これらのコマンドレットの代わりにリダイレクト">"を使ってもよいが、その場合はUTF16固定になる。
- Set-Contentはデフォルトの文字コードであるSJISで書き出される。
- Out-Fileは内部文字コードであるUTF16で書き出される。
UTF8のBOMの除去
PowerShellによる
[System.IO.File]::WriteAllLines("utf8-bom.txt", "utf8-nobom.txt")
nkfコマンドによる
nkf.exe -W8 -w --overwrite utf8.txt