【テクニカル・上級編】【日本語エンコーディング自動判別】ADODB.Stream と FSO を併用した EUC-JP / ISO-2022-JP テキストの検知とUTF-8変換 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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というツールで制御する。この感覚こそが、真の自動化エンジニアの醍醐味だ。コードを一行書くたびに、それがどのようなメモリ領域で動き、どのようなプロセスを経て変換されるのか。その想像力さえあれば、どんなレガシーシステムも恐れることはない。

さあ、そのスクリプトで、闇に埋もれたデータを現代に呼び戻せ。

タイトルとURLをコピーしました