VBScriptの深淵を覗く:BOM解析による「文字コード自動判別」でファイル操作を完璧に制御する
こんにちは。業務自動化の世界へようこそ。
VBScriptは一見「古い言語」に見えるかもしれませんが、WindowsのOSの深層部で今なお呼吸を続ける、極めて強力かつ無駄のないツールです。
多くの人がマクロの記録や単純なファイル操作で満足していますが、真のエンジニアは「文字化け」という見えない敵と戦わなければなりません。今日は、ただファイルを読み込むだけでなく、その正体を解析し、環境に合わせて最適な武器(オブジェクト)を使い分ける、プロフェッショナルな手法を伝授しましょう。
—
1. なぜ「BOM」の解析が必要なのか?
ファイルを開いた瞬間に「文字化け」が起きる原因は、ほとんどの場合、「ファイルが何語で書かれているか(エンコーディング)」と「読み込む側の解釈」が一致していないからです。
Windowsのファイルシステムにおいて、これを解決する鍵が「BOM(Byte Order Mark)」です。ファイルの先頭にある数バイトの署名を読み取ることで、そのファイルがUTF-8なのか、UTF-16なのか、あるいは従来のShift-JIS(ANSI)なのかを瞬時に判定できます。
BOMの代表的な指紋
- `EF BB BF` → UTF-8
- `FF FE` → UTF-16 (Little Endian)
- `FE FF` → UTF-16 (Big Endian)
- 上記以外 → Shift-JISの可能性が高い(※厳密には判定不可だが、実務上の定石)
—
2. 武器の使い分け:FSO vs ADODB.Stream
VBScriptでファイルを扱う際、我々には二つの主要な武器があります。
1. Scripting.FileSystemObject (FSO)
- 得意技: フォルダ操作、単純なファイル読み書き。
- 弱点: 日本語のエンコーディング制御が苦手(基本的にShift-JIS前提)。
2. ADODB.Stream
- 得意技: 文字コードの変換、バイナリデータの読み込み。
- 強み: 現代の標準であるUTF-8を正確に解釈できる。
「FSOで手軽に掴み、ADODB.Streamで精密に処理する」。これが、現場で戦い抜くためのハイブリッドな戦略です。
—
3. 実践:文字コード自動判別ライブラリ
それでは、これらを統合した「堅牢な読み込み関数」を見ていきましょう。このコードをコピーして保存すれば、どんなファイルが来ても怖くありません。
‘ ファイルの内容を文字コードを自動判別して取得する関数
Function ReadFileAuto(filePath)
Dim adoStream, fso, file, bin, head
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ファイルサイズが0なら空文字を返す
If fso.GetFile(filePath).Size = 0 Then
ReadFileAuto = “”
Exit Function
End If
‘ ADODB.Streamでバイナリとして先頭3バイトを読み取る
Set adoStream = CreateObject(“ADODB.Stream”)
adoStream.Type = 1 ‘ adTypeBinary
adoStream.Open
adoStream.LoadFromFile filePath
bin = adoStream.Read(3)
adoStream.Close
‘ バイナリから16進数文字列へ変換
head = Right(“0” & Hex(AscB(MidB(bin, 1, 1))), 2) & _
Right(“0” & Hex(AscB(MidB(bin, 2, 1))), 2) & _
Right(“0” & Hex(AscB(MidB(bin, 3, 1))), 2)
‘ エンコーディングの判定と再読み込み
adoStream.Type = 2 ‘ adTypeText
If Left(head, 6) = “EFBBBF” Then
adoStream.Charset = “UTF-8”
ElseIf Left(head, 4) = “FFFE” Or Left(head, 4) = “FEFF” Then
adoStream.Charset = “Unicode”
Else
adoStream.Charset = “Shift-JIS”
End If
adoStream.Open
ReadFileAuto = adoStream.ReadText
adoStream.Close
‘ オブジェクトの解放(メモリ管理の鉄則)
Set adoStream = Nothing
Set fso = Nothing
End Function
—
4. 陥りやすいエラーと成功のヒント
① オブジェクトの解放を忘れない
VBScriptはメモリ管理を自動で行いますが、`Set obj = Nothing` を書くことは、「私はここでこの役割を終えた」とシステムに宣言するプロの作法です。特に大量のファイルをループ処理する場合、これを怠るとメモリリークの原因となります。
② なぜ「Binary」で読み込むのか?
`adTypeText`で最初から開くと、ファイルがUTF-8なのにShift-JISで解釈され、読み込んだ瞬間に文字化け(データの破壊)が起きます。まずバイナリで「素のデータ」を取り出し、中身を確認してから、正しい「翻訳機(Charset)」を通す。これが遠回りに見えて、実は最も速く正確な道なのです。
—
最後に:ここをクリアすれば、あなたはもう中級者です
このコードを理解し、実際に動かせたなら、もう「マクロの記録」に頼るだけのユーザーではありません。ファイルの「中身」まで見通すことができる、立派な自動化エンジニアの仲間入りです。
文字コードという「見えない壁」を突破したことで、あなたの自動化ツールは、社内のどんな古いシステムとも、あるいは最新のWeb APIとも会話ができるようになります。
次回のステップでは、読み取ったテキストを正規表現で整形し、データベースへ流し込む方法について解説しましょう。
VBScriptの旅はまだ始まったばかりです。楽しんでいきましょう!
