VBScriptでUTF-8を制す!ADODB.Streamによる文字化け完全回避術
こんにちは。現場で泥臭い自動化と格闘している皆さん、お疲れ様です。
VBScriptを触っていると、避けて通れないのが「文字コードの壁」です。標準の`FileSystemObject (FSO)`は便利ですが、残念ながら「UTF-8」の扱いに極めて弱く、BOMなしUTF-8を読み書きしようものなら、即座に文字化けの洗礼を受けることになります。
「メモ帳で開くと普通なのに、スクリプトで読むと化ける」
この絶望を解消するために、今日はWindowsの奥底に眠る強力な兵器「ADODB.Stream」を召喚しましょう。これさえマスターすれば、VBScriptの表現力は一気にプロフェッショナルな領域へと引き上がります。
—
1. なぜFSOではなくADODB.Streamなのか?
まず、敵を知りましょう。
- FileSystemObject (FSO): 基本は「システム標準(ANSI)」か「Unicode(UTF-16LE)」しか扱いません。UTF-8を読み込ませると、無理やりANSIとして解釈しようとして壊れます。
- ADODB.Stream: もともとはデータベース用のオブジェクトですが、文字コードの変換テーブルを内部で持っています。 これにより、メモリ上で「UTF-8のバイト列」を「VBScriptが扱う文字列」へ正しく翻訳(デコード)できるのです。
—
2. 実践:UTF-8ファイルを安全に読み込むコード
まずは、UTF-8ファイルを読み込み、中身を文字列として取得する「安全な関数」を紹介します。
‘ UTF-8ファイルを読み込んで文字列を返す関数
Function ReadTextFileUTF8(filePath)
Dim adoStream
Set adoStream = CreateObject(“ADODB.Stream”)
‘ バイナリモードで開く
adoStream.Type = 1 ‘ adTypeBinary
adoStream.Open
adoStream.LoadFromFile filePath
‘ テキストモードに切り替え、エンコーディングを指定
adoStream.Type = 2 ‘ adTypeText
adoStream.Charset = “UTF-8”
‘ 中身を読み込む
ReadTextFileUTF8 = adoStream.ReadText
‘ 後始末(重要:メモリ解放を怠らないこと)
adoStream.Close
Set adoStream = Nothing
End Function
【知見:ライフサイクルの管理】
エンジニアとして一つアドバイス。`Set adoStream = Nothing` を忘れないでください。VBScriptのオブジェクトは、明示的に解放しないとスクリプトが終了するまでメモリに残り続けます。大量のファイルを処理するループの中でこれを忘れると、メモリリークの温床になります。
—
3. 実践:文字列をUTF-8で書き出すコード
次に、書き込みです。ここで一つ罠があります。それは「BOM(Byte Order Mark)」の存在です。
‘ 文字列をUTF-8(BOMなし)で保存する関数
Sub WriteTextFileUTF8(filePath, strText)
Dim adoStream
Set adoStream = CreateObject(“ADODB.Stream”)
adoStream.Type = 2 ‘ adTypeText
adoStream.Charset = “UTF-8”
adoStream.Open
adoStream.WriteText strText
‘ 【重要】UTF-8のBOMを除去する処理
‘ ADODB.StreamはデフォルトでBOMを付けるため、先頭3バイトを切り捨てる
adoStream.Position = 0
adoStream.Type = 1 ‘ バイナリモードへ
adoStream.Position = 3 ‘ BOM分(3バイト)スキップ
Dim binaryData
binaryData = adoStream.Read
adoStream.Close
‘ 改めてBOMなしで保存
adoStream.Open
adoStream.Write binaryData
adoStream.SaveToFile filePath, 2 ‘ 2 = adSaveCreateOverWrite
adoStream.Close
Set adoStream = Nothing
End Sub
—
4. 陥りやすいエラーと回避の鉄則
① 「ファイルが開けません」エラー
ADODB.Streamは、ファイルが他のプロセスでロックされていると容赦なくエラーを吐きます。 FSOよりも排他制御にシビアです。読み込み直前に `On Error Resume Next` で囲うか、ファイルが空でないかを確認するガード節を入れましょう。
② Charsetのスペルミス
`adoStream.Charset = “utf-8″` の指定は文字列ですが、大文字小文字は問いません。しかし、`”UTF8″` と書くと、OSの環境によっては認識されないことがあります。必ず `UTF-8` とハイフンを入れるのが確実です。
—
先輩からのメッセージ
VBScriptは古い言語と言われますが、Windowsの標準機能だけで完結するその「軽さ」と「即効性」は、現代の複雑な環境下でも強力な武器になります。
今回紹介した `ADODB.Stream` は、単なるファイル操作ツールではなく、「文字コードという複雑なデータを、あなたのプログラムが扱える形に翻訳する通訳者」です。
この通訳者を正しく使いこなせるようになれば、もう文字化けで夜中に呼び出されることはありません。自信を持って、自動化の世界を突き進んでください!
また何か詰まったら、いつでも聞きに来てくださいね。応援しています。
