
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の有無を調べたいときは、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」をクリックします。

次に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が含まれていると、コンパイラやインタプリタが最初の行を正しく解析できず、エラーが発生することがあるので注意が必要です。