見出し画像

PowerShell BOM無しUTF-8のテキストファイルを作成

WIndows PowerShellでUTF-8のテキストファイルを作るとBOM付になってしまいます。
これが原因で他のシステムと連携が上手く動作しないことがあります


普通にUTF-8のテキストファイルを作った場合

"testtext" | Out-File -Encoding utf8 .\test_utf8wb.txt
Get-Content .\test_utf8wb.txt -Encoding utf8
Format-Hex .\test_utf8wb.txt

PS C:\temp> "testtext" | Out-File -Encoding utf8 .\test_utf8wb.txt
>> Get-Content .\test_utf8wb.txt -Encoding utf8
>> Format-Hex .\test_utf8wb.txt
>>
testtext


 パス: C:\temp\test_utf8wb.txt

 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 EF BB BF 74 65 73 74 74 65 78 74 0D 0A testtext..

バイナリでファイルを開くと先頭から「0xEF 0xBB 0xBF」から始まりBOM付きのUTF-8であることがわかる。
Windowsではファイルの先頭のBOM情報で文字コードを識別しているらしく、勝手にBOM情報がついてしまいます。
Windows同士ならこれでもいいのですが、他のシステムにファイルを渡した時に不都合が起こってしまいます。

解決策がこちら↓↓↓

BOM無しUTF-8のテキストファイル出力

WriteAllLinesを使うとBOM無しUTF-8になります

[IO.File]::WriteAllLines("c:\temp\test_utf8nb.txt", "testtext")
Get-Content .\test_utf8nb.txt -Encoding utf8
Format-Hex .\test_utf8nb.txt

PS C:\temp> [IO.File]::WriteAllLines("c:\temp\test_utf8nb.txt", "testtext")
>> Get-Content .\test_utf8nb.txt -Encoding utf8
>> Format-Hex .\test_utf8nb.txt
>>
testtext


 パス: C:\temp\test_utf8nb.txt

 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 74 65 73 74 74 65 78 74 0D 0A testtext..

「0xEF 0xBB 0xBF」から始まっていないのでBOM無しのUTF-8であることがわかる。


CSVテキストをBOM無しUTF-8で出力

$text = "りんご,100", "ばなな,250", "いちご,125"
[IO.File]::WriteAllLines("c:\temp\test_utf8nb.csv", $text)
Get-Content .\test_utf8nb.csv -Encoding utf8
Format-Hex .\test_utf8nb.csv
りんご,100
ばなな,250
いちご,125


 パス: C:\temp\test_utf8nb.csv

 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 E3 82 8A E3 82 93 E3 81 94 2C 31 30 30 0D 0A E3 ããã,100..ã
00000010 81 B0 E3 81 AA E3 81 AA 2C 32 35 30 0D 0A E3 81 °ãªãª,250..ã
00000020 84 E3 81 A1 E3 81 94 2C 31 32 35 0D 0A ã¡ã,125..



#PowerShell #毎日Note #プログラミング #プログラミング初心者 #プログラミング学習 #UTF -8 #BOM無し #文字コード問題 #Windows



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