UTF-8のBOM付き・BOMなしの違いとBOMの追加・削除方法

UTF-8のBOM付き・BOMなしの違い

UTF-8は多言語対応の文字エンコーディング方式で、通常は「BOM(Byte Order Mark)」が不要なエンコーディングです。

しかし、一部のシステムやソフトウェアではBOMが含まれる場合があります。

BOM付きとBOMなしの違いは、ファイルの先頭にBOMが存在するかどうかにあります。

BOM付きのテキストファイルをVS Codeなどのテキストエディタで開いても、1行目にBOMのデータ(\xEF\xBB\xBF)は表示されません。

BOM付き・BOMなしの確認方法

VS Codeがあれば、BOM付き・BOMなしはファイルを開いた際に、BOM付きの場合は画面右下に「UTF-8 with BOM」と表示されます。

テキストファイルBOM付き テキストファイルBOMなし

VS Codeで「UTF-8 with BOM」の表示を確認

テキストファイルが複数あって、コマンドを実行してBOMの有無を調べたいときは、Macの場合はターミナルでfileコマンドを実行して調べます。

$ file *.txt
bom.txt: Unicode text, UTF-8 (with BOM) text
foo.txt: ASCII text

Windowsの場合はPowerShellを使用しますが、fileコマンドが使えないのでコードが複雑です。

$ Get-ChildItem -Path 'C:\path\to\your\directory\*.txt' | ForEach-Object {
    $file = $_
    $bytes = [System.IO.File]::ReadAllBytes($file.FullName)
    if ($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
        "$($file.Name): BOMあり"
    } else {
        "$($file.Name): BOMなし"
    }
}

VS CodeでBOMの追加・削除方法

VS CodeでBOMの追加・削除をする場合は、テキストファイルを開いて、右下のUTF-8 (with BOM) をクリック後に、「Save with Encoding」をクリックします。

VS Codeの「Save with Encoding」をクリック

次にSelect File Encoding to Save withが表示されるので、「UTF-8 with BOM」または「UTF-8」を選択すれば、BOMの追加・削除ができます。

コマンドでのBOMの追加・削除方法

macOSの場合

Macの場合はターミナルで以下のコマンドでBOMの追加・削除を実行できます。

「\xEF\xBB\xBF」はBOMです。

# BOMの追加
echo -ne '\xEF\xBB\xBF' | cat - foo.txt > tmp.txt && mv tmp.txt foo.txt

# BOMの削除
sed -i '' '1s/^\xEF\xBB\xBF//' foo.txt

Windowsの場合

Windowsの場合はPowerShellで以下のコマンドでBOMの追加・削除を実行できます。

# BOMの追加
$BOM = [byte[]](0xEF, 0xBB, 0xBF)
Set-Content -Path foo.txt -Value $BOM -Encoding Byte
Add-Content -Path foo.txt -Value (Get-Content -Path foo.txt -Encoding UTF8)

# BOMの削除
(Get-Content -Path foo.txt -Encoding Byte)[3..($content.Length - 1)] | Set-Content -Path foo.txt -Encoding Byte

まとめ

UTF-8のBOM付き・BOMなしの違いとBOMの追加・削除方法について解説しました。

BOMが付いていると、CSVやTSVファイルだとデータの処理や解析に問題を引き起こすことがあります。

また、プログラムのソースコードやスクリプトファイルにBOMが含まれていると、コンパイラやインタプリタが最初の行を正しく解析できず、エラーが発生することがあるので注意が必要です。