小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


VBScriptでファイルにBOM(Byte Order Mark)がついているかどうかを判定する方法

はじめに

VBScriptでファイルにBOM(Byte Order Mark)が付加されているかどうかは、ファイルを1バイトずつ読み込んでいき、BOM特有のバイト列が存在するかを調べることで、判定することができます。
本エントリでは、ファイルにBOMがついているかをVBScriptで調べる方法を紹介します。

BOM(Byte Order Mark)とは

UnicodeのUTF-16などの16bit単位の文字エンコーディングスキームでは、8bit単位でデータを配列する際のエンディアンとして、ビッグエンディアンとリトルエンディアンの両方を許している。そのため、どちらのエンディアンで記述されたデータかを確実に判定するための特別なマークとなる符号として、BOM(Byte Order Mark)が用意されている。

 またBOMは、あるテキストがUnicodeで記述されているかどうかを自動判定する手段として使用される場合もある。この目的に使用される場合は、エンディアンが存在するUTF-16だけでなく、エンディアンが存在しないUTF-8のテキストに付加される場合もある。
XML用語事典 [BOM (Byte Order Mark)] はてなブックマーク - XML用語事典 [BOM (Byte Order Mark)]

ADODB.Streamオブジェクトを利用し、バイナリ形式でファイルを読み込む

以下のように、ADODB.Streamオブジェクトを使うと、ファイルをバイナリ形式で読み込むことができます。

With CreateObject("ADODB.Stream")
  .Open
  .Type = 1
  .LoadFromFile("xxx.txt")
  data = .Read
  .Close
End With

そして、読み込んだバイナリデータの先頭バイトを以下のように判定します。

  • 先頭2バイトがFEFFか、FFFEかどうか
  • 先頭3バイトがEFBBBFかどうか
Dim a : Hex(AscB(MidB(data, 1, 1)))
Dim b : Hex(AscB(MidB(data, 2, 1)))
Dim c : Hex(AscB(MidB(data, 3, 1)))

If (a = "FE" AND b = "FF") OR _
   (a = "FF" AND b = "FE") Then
   ' UTF-16のBOMあり

End If

If a = "EF" AND b = "BB" AND c = "BF" Then
  ' UTF-8のBOMあり

End If