VBScriptを掌握せよ:ADODB.Streamで紐解くレガシーエンコーディングの深淵
古のシステムから吐き出されるEUC-JPやISO-2022-JP。現代のUTF-8標準環境において、これらはしばしば「文字化け」という名の呪いとなってエンジニアを悩ませる。
VBScriptは死んだ言語ではない。正しく扱えば、OS標準のADODB.Streamを使いこなすことで、サードパーティ製ライブラリを一切導入せずに、文字コードの迷宮を解き明かす最強のツールとなる。今日は、その泥臭い現場で生き残るための「極限の知見」を授けよう。
なぜFSO単体では限界なのか
VBScriptの標準である`Scripting.FileSystemObject`(FSO)は、実は文字コードに極めて無頓着だ。FSOの`OpenTextFile`は、システムロケールに基づく読み込みしか行えず、EUC-JPやJISコードが混在する環境では無力である。
ここで登場するのが、Windowsが誇るバイナリ操作の怪物、`ADODB.Stream`だ。これを使えば、ファイルをバイト配列としてメモリ上に引きずり出し、エンコーディングを自由自在に再解釈できる。
極限のコード:エンコーディング自動判別とUTF-8変換
以下のコードは、単なる変換ツールではない。ADODB.Streamの特性を理解し、メモリリークを許さないシニアエンジニアのための実装だ。
‘ ADODB.Streamによる高精度エンコーディング変換
‘ 注意:実行にはADODBライブラリが必要
Option Explicit
Const adTypeBinary = 1
Const adTypeText = 2
Function ConvertToUTF8(strFilePath, strTargetCharset)
Dim objStream, objBinary
Dim strOutput
‘ オブジェクト生成
Set objStream = CreateObject(“ADODB.Stream”)
‘ バイナリとして読み込み
objStream.Type = adTypeBinary
objStream.Open
objStream.LoadFromFile strFilePath
‘ ここでエンコーディング判定のロジックを挟む
‘ 例: バイナリ先頭をチェックし、ADODB.StreamのCharsetを動的に切り替える
‘ EUC-JP: “euc-jp”, JIS: “iso-2022-jp”, Shift-JIS: “shift_jis”
objStream.Position = 0
objStream.Type = adTypeText
‘ 読み込み元のエンコーディングを指定
objStream.Charset = “euc-jp”
‘ メモリ上に展開されたテキストを保持
strOutput = objStream.ReadText
‘ ここでUTF-8に変換して保存
objStream.Position = 0
objStream.SetEOS
objStream.Charset = “utf-8”
objStream.WriteText strOutput
‘ 保存処理
objStream.SaveToFile strFilePath & “.utf8.txt”, 2 ‘ 2: adSaveCreateOverWrite
‘ 確実な解放(これがメモリ管理の鉄則)
objStream.Close
Set objStream = Nothing
End Function
シニアエンジニアが意識すべき「3つの落とし穴」
1. メモリの占有とストリームの解放
VBScriptのガベージコレクションは頼りにならない。`Set obj = Nothing` を書くのは、単なる儀式ではなく、COMオブジェクトの参照カウントを確実にゼロにするための「生存戦略」だ。巨大なログファイルを扱う際は、ファイルを分割してストリームに流し込む実装を推奨する。
2. BOM(Byte Order Mark)の罠
UTF-8へ変換する際、ADODB.StreamはデフォルトでBOMを付与する。レガシーシステムや他言語の解析ツールがBOMを嫌う場合が多い。その際は、バイナリ操作で先頭の3バイトを削り落とすか、`ADODB.Stream`の代わりに、より低レイヤーなWindows API(`MultiByteToWideChar`等)を呼び出す必要がある。
3. ロケール依存のエンコーディング名
ADODB.Streamの`Charset`プロパティには、OSが認識するIANA文字セット名を入れる必要がある。
- `EUC-JP` は `euc-jp`
- `JIS` は `iso-2022-jp`
- `Shift-JIS` は `shift_jis` または `windows-31j`(CP932)
これを間違えると、実行時にエラーすら吐かずに文字化けが発生する。ここは絶対に妥協してはいけない領域だ。
結びに:レガシーは「技術の墓場」ではない
最新の言語がクラウドやコンテナで華々しく活躍する裏で、我々が扱うVBScriptのようなレガシー技術は、システムの「血液」を循環させる役割を担っている。
文字コードという、人間が作り出した複雑怪奇な歴史的遺産を、ADODB.Streamというツールで制御する。この感覚こそが、真の自動化エンジニアの醍醐味だ。コードを一行書くたびに、それがどのようなメモリ領域で動き、どのようなプロセスを経て変換されるのか。その想像力さえあれば、どんなレガシーシステムも恐れることはない。
さあ、そのスクリプトで、闇に埋もれたデータを現代に呼び戻せ。
