UTF-8のテキストファイルにはBOM有無の2種類がある

文字コードがUTF-8のテキストファイルには、BOMがあるファイルと無いファイルの2種類があります。

BOM(ボム)とは「バイトオーダーマーク(Byte Order Mark)」の通称で、Unicodeのテキストファイルであることを明示するためにテキストファイルの先頭から2~4バイトを使って特殊文字を埋め込まれたデータのことを言います。

WindowsでのUnicodeは一般的にはUTF-8のことを指すことがほとんどです。UTF-8のBOMは、テキストファイルの先頭に「0xEF 0xBB 0xBF」の3バイトが埋め込まれます。

なお、UTF-7やUTF-16などの他の符号化形式の場合のBOMはUTF-8とは違うデータになります。

このBOMですが、ExcelでUTF-8のテキストファイルを扱う際に結構重要だったりします。というのも、文字コードがUTF-8でBOM無しのCSVファイルをダブルクリックした場合、UTF-8のデータであることを判定できず、Shift-JISとして開いてしまい文字化けしてしまいます。BOMが付いていればUTF-8と判定して文字化けは起こりません。

このような問題を回避するために、文字化けが発生しそうなテキストファイルかどうかの判定をするには、イチかバチかダブルクリックして文字化けするかどうかを見るか、ってことになってきます。

いちいちExcelで開くのは面倒なので、事前にVBAでBOMが付いているかどうかを判定する方法を紹介します。

BOMの判定を行うコード

以下の関数は、引数で渡されたテキストファイルの先頭3バイトにBOMが付いているかどうかを判定します。戻り値として、BOMがあればTrue、なければFalseを返します。

処理の内容はコメントにほとんど書いてますが、やっていることの概要は、引数のテキストファイルを先頭3バイト読み込んで、「0xEF 0xBB 0xBF」と同じかどうかを調べて、同じであればBOMが付いている、と判定しています。

なお、引数のテキストファイルが3バイト未満の場合はBOMなしを返します。

処理中でのテキストファイルの操作はバイナリデータを扱う方法で行っています。

バイナリデータを扱う方法の詳細については「VBAでバイナリファイルを読み込む(一括、1バイト、指定バイト)」をご参照ください。

使い方

上のIsBomExists関数の使い方です。

BOMがあるかどうかを調べたいテキストファイルを引数として渡して、Boolean型の変数で受け取ります。BOMがついていれば戻り値にTrueが設定され、ついてなければFalseが設定されます。