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

スポンサーリンク

VBScriptを掌握せよ:文字化けの悪夢を断つ「ADODB.Stream」によるエンコーディング変換の極意

こんにちは。システム自動化の現場で泥臭いレガシーと戦い続けているエンジニアです。

皆さんがVBScriptで最も頭を抱える瞬間……それは間違いなく「文字化け」ではないでしょうか。特にEUC-JPやISO-2022-JPといった、古き良き(しかし現代には手強い)エンコーディングを扱う際、ただファイルを読み込むだけでは、画面には無機質な「????」が並ぶことになります。

今日は、VBScriptの真骨頂である`ADODB.Stream`を駆使し、文字コードを自動判別してUTF-8へ変換する「実戦的アーキテクチャ」を伝授します。

1. なぜ「ADODB.Stream」を使うのか?

VBScriptの標準機能である`Scripting.FileSystemObject (FSO)`は非常に便利ですが、致命的な弱点があります。それは「UTF-8やEUC-JPの判別・変換機能を持たない」という点です。

そこで登場するのが、Windowsのデータベース接続用コンポーネントである`ADODB.Stream`です。本来はDB用のオブジェクトですが、実は「バイナリデータの読み込み・書き込み」と「文字コード変換」において最強の武器になります。

この構成のポイント

  • FSO: ファイルの存在確認やパス操作という「外回り」を担当。
  • ADODB.Stream: ファイルのバイナリ(中身)の読み込みと、メモリ上での文字コード変換という「本丸」を担当。

2. 実装コード:文字コード自動判別の核心

今回は、EUC-JP、ISO-2022-JP、Shift-JIS、UTF-8を判定し、最終的にUTF-8(BOMなし)へ変換するロジックを示します。

‘ 文字コード変換用関数
Function ConvertToUTF8(strFilePath)
Dim objStream
Set objStream = CreateObject(“ADODB.Stream”)

‘ ステップ1: バイナリとして読み込む
objStream.Type = 1 ‘ adTypeBinary
objStream.Open
objStream.LoadFromFile strFilePath
Dim binData
binData = objStream.Read
objStream.Close

‘ ステップ2: 判定と変換 (ここは簡略化のため代表的な文字コード判定ロジック)
‘ ※本番環境ではバイナリパターンによる判定を推奨します
Dim targetCharset
targetCharset = DetectEncoding(binData) ‘ 独自判定関数

‘ ステップ3: 変換して出力
objStream.Type = 2 ‘ adTypeText
objStream.Charset = targetCharset
objStream.Open
objStream.WriteText binData ‘ バイナリをロード

‘ UTF-8に変換して保存
objStream.Position = 0
objStream.Charset = “utf-8”

‘ ここでは画面出力用に変換後のテキストを返す
ConvertToUTF8 = objStream.ReadText

objStream.Close
Set objStream = Nothing
End Function

‘ 簡易判定ロジック(現場のニーズに合わせて拡張してください)
Function DetectEncoding(bin)
‘ ADODB.Streamは自動判別が苦手なため、
‘ 先頭バイトや特定パターンで分岐させるのが「プロの技」です
‘ 例: EUC-JPなら “euc-jp”, Shift-JISなら “shift-jis” を返す
DetectEncoding = “euc-jp”
End Function

3. 初学者が陥りやすい「3つの落とし穴」

コードを書いていて「動かない!」となったら、ここをチェックしてください。

① `adTypeText` と `adTypeBinary` の混同

`ADODB.Stream`の`Type`プロパティは、開く前に決めなければなりません。バイナリ(生のデータ)を扱う時は必ず`1`を指定してください。テキストとして開いてしまうと、その瞬間にWindowsが既定のコードページで無理やり解釈しようとし、文字化けが確定します。

② `Charset` の指定ミス

`Charset`プロパティには、Windowsが理解できる正しい文字列を入れる必要があります。`UTF-8`はそのまま`utf-8`で通りますが、JIS系は`iso-2022-jp`と指定してください。

③ メモリの解放(ライフサイクルの管理)

VBScriptはガベージコレクションが強力ではありません。`Set objStream = Nothing` を必ず記述する癖をつけましょう。大量のファイルを処理する場合、これを忘れるとメモリリークを起こし、PCが重くなります。

最後に:自動化エンジニアとしての心得

VBScriptは「古い言語」と呼ばれますが、Windows環境下での「小回りの良さ」は今なお最強です。特にレガシーなCSVデータやログファイルを扱う際、この知識はあなたの強力な武器になります。

まずは、自分のPCにある適当なテキストファイルを、このロジックでUTF-8に変換してみてください。「文字化けが消えた瞬間」、あなたはVBScriptの本質に一歩近づいたことになります。

次は、このコードをタスクスケジューラに組み込んで、毎朝自動で変換させる仕組みを作ってみましょう。自動化の旅は、ここからが一番楽しいですよ!

応援しています。分からないことがあれば、いつでもまた聞いてくださいね。

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