【入門編】【文字コード問題】FSOのShift_JIS制限とADODB.Streamを組み合わせたUTF-8ファイルの安全な読み書き – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは! VBScriptの世界へようこそ。
業務自動化の現場で、Excelマクロの限界を超えてWindows環境を裏からガッツリ支えてくれるのがVBScriptの頼もしいところです。

さて、今回は実務で100%と言っていいほどぶ Tぶつかる壁、「文字コードの罠」についてお話しします。

「VBScriptでテキストファイルを読み書きしたい!」と思ったとき、真っ先に登場するのが `Scripting.FileSystemObject`(通称:FSO)というオブジェクトですよね。ファイルやフォルダを操作するのには最高の相棒なのですが……実はこいつ、現代の標準である「UTF-8」がちょっと苦手という致命的な弱点を持っています。

特に「BOMなしUTF-8」や、日本語環境につきものの「Shift_JIS」の壁で文字化けを起こし、頭を抱えた夜がある方も多いはず。

ここをクリアすれば、あなたもVBScriptのファイル操作で迷うことはなくなります!一緒に本質をマスターしていきましょう。

—

1. なぜFSO単体ではUTF-8ファイルを扱えないのか?

まず、私たちが普段よく使う `FileSystemObject` の `OpenTextFile` メソッドの仕様を確認しておきましょう。

FSOがファイルを開くとき、文字コードを指定する引数(`Tristate`)には以下の3つしかありません。

  • `TristateFalse` (ASCII / 既定値:実質Shift_JISとして扱われることが多い)
  • `TristateTrue` (Unicode / 実質UTF-16LE)
  • `TristateUseDefault` (システム既定)

お気づきでしょうか? 「UTF-8」を指定する選択肢が、そもそも存在しないのです。

無理やりFSOでUTF-8のファイルを読み込もうとすると、日本語がすべて「文字化け(謎の記号の羅列)」になって爆ぜます。また、昨今のWeb APIやモダンな設定ファイルで主流となっている「BOMなしUTF-8」にいたっては、FSOの手に負える代物ではありません。

じゃあどうするのか?
ここで登場するのが、Windowsのデータベース処理などで使われる隠し味、`ADODB.Stream` オブジェクトです。

—

2. 救世主「ADODB.Stream」との組み合わせ

`ADODB.Stream` は、メモリ上でデータの流れ(ストリーム)を制御するオブジェクトです。これを使うことで、文字コードを「UTF-8」や「Shift_JIS」に明示的に指定して、バイナリデータを正しくテキストに変換・逆変換できるようになります。

イメージ図にするとこんな感じです。

【UTF-8ファイル】 ──(バイナリ)──> [ ADODB.Stream ] ──(文字コード指定)──> 正しい文字列としてVBScriptへ!

FSOが「力持ちの作業員」なら、`ADODB.Stream` は「繊細な通訳者」です。この2人をタッグを組ませるのが、実務で生き残るための最強のテクニックとなります。

—

3. 【実践】UTF-8ファイルを「安全に読み込む」コード

それでは実際のコードを見てみましょう。
開発現場でそのままコピペして使えるよう、エラーハンドリングの基本も入れた実用的な関数形式にしています。

‘ =================================================================
‘ 概要: UTF-8(BOM付き/なし両対応)のファイルを安全に読み込む関数
‘ 引数: filePath (String) – 読み込むファイルのフルパス
‘ 戻り値: ファイルのテキスト内容 (String)
‘ =================================================================
Function ReadUtf8TextFile(filePath)
Dim objStream
Dim fileContent

‘ ADODB.Stream オブジェクトの生成
Set objStream = CreateObject(“ADODB.Stream”)

On Error Resume Next ‘ 万が一のファイル不在などに備える

With objStream
.Type = 2 ‘ 1:バイナリデータ, 2:テキストデータとして扱う
.Charset = “UTF-8” ‘ 文字コードを明確にUTF-8に指定!
.Open

‘ ファイルからストリームへデータを読み込む
.LoadFromFile filePath

If Err.Number <> 0 Then
WScript.Echo “ファイル読み込みエラー: ” & Err.Description
ReadUtf8TextFile = “”
.Close
Set objStream = Nothing
Exit Function
End If

‘ ストリームの先頭から最後までを文字列として取得
fileContent = .ReadText(-1) ‘ -1 は全データ読み込みの意味

.Close
End With

Set objStream = Nothing
On Error GoTo 0 ‘ エラー監視を元に戻す

ReadUtf8TextFile = fileContent
End Function

‘ — 実行テスト —
Dim text
text = ReadUtf8TextFile(“C:\work\sample.txt”)
WScript.Echo text

コードのポイント解説

1. `.Type = 2`: ストリームをテキストモードに設定します。これによって文字コードの変換が有効になります。
2. `.Charset = “UTF-8″`: ここが最大の肝です。ここでUTF-8を指定することで、裏側でよしなにデコードしてくれます。
3. `.ReadText(-1)`: ストリーム全体のテキストを一気に吸い上げます。メモリ効率も良く高速です。

—

4. 【実践】UTF-8でファイルを「安全に書き込む」コード

今度は逆に、VBScriptで処理した結果をUTF-8(BOM付きか、あるいはモダンなBOMなし)で保存したい場合のコードです。

Web APIに投げるJSONデータや、UTF-8指定のログファイルを作る際によく使います。

‘ =================================================================
‘ 概要: 文字列をUTF-8形式でファイルに書き込む関数(BOMなし対応)
‘ 引数: filePath (String) – 保存先ファイルのフルパス
‘ content (String) – 書き込む文字列
‘ =================================================================
Sub WriteUtf8TextFile(filePath, content)
Dim objStream
Dim binaryData

Set objStream = CreateObject(“ADODB.Stream”)

With objStream
.Type = 2 ‘ テキストモード
.Charset = “UTF-8” ‘ 文字コードにUTF-8を指定
.Open

‘ ストリームにテキストを書き込む
.WriteText content

‘ — 【重要】BOM(Byte Order Mark)を取り除くテクニック —
‘ ADODB.StreamでUTF-8を書くと、デフォルトでファイルの先頭にBOM(EF BB BF)が付与されます。
‘ 「BOMなし」で書き出したい場合は、一度バイナリモードに切り替えて先頭3バイトをカットします。
.Position = 0
.Type = 1 ‘ バイナリモードに変更
.Position = 3 ‘ 先頭の3バイト(BOM部分)をスキップ

binaryData = .Read ‘ 残りのバイナリデータを取得
.Close
End With

‘ 削ったバイナリデータを改めて別ストリームでファイル出力する
Set objStream = CreateObject(“ADODB.Stream”)
With objStream
.Type = 1 ‘ バイナリモード
.Open
.Write binaryData
.SaveToFile filePath, 2 ‘ 2:上書き保存を許可 (adSaveCreateOverWrite)
.Close
End With

Set objStream = Nothing
WScript.Echo “ファイルの書き込みが完了しました: ” & filePath
End Sub

‘ — 実行テスト —
Call WriteUtf8TextFile(“C:\work\output.txt”, “こんにちは、VBScriptの世界へ!”)

ここがプロの知見:BOMのコントロール

`ADODB.Stream` で `Charset = “UTF-8″` にしてテキストを書き込むと、ファイルの先頭に必ず「BOM(EF BB BF)」という不可視の署名データが付いてしまいます。
PowerShellや一部のLinux系ツール、PythonのスクリプトなどがこのBOMを嫌うことが多いため、上記のコードでは「一度バイナリに落として先頭3バイトをブチ抜く」というテクニックを使っています。この小ワザを知っているだけで、「おっ、こいつデキるな…!」と現場で一目置かれること間違いなしです。

—

まとめ:ここをクリアすれば、もう文字化けは怖くない!

今回は、FSOの弱点を `ADODB.Stream` で補うという、VBScript実務において最も重要で避けて通れないテーマを解説しました。

  • FSO単体ではUTF-8を正しく扱えない(文字化けの原因になる)
  • 読み込み時は `ADODB.Stream` の `.Charset = “UTF-8″` と `.LoadFromFile` を使う
  • 書き込み時、BOMなしにしたい場合はバイナリ変換(先頭3バイトスキップ)のテクニックを使う

この2つのパターンをテンプレートとして手元に持っておくだけで、どんな文字コードのファイルが送られてきても秒で処理できるようになります。

ここをクリアすれば、VBScriptのファイル操作の基本はもうバッチリですよ!
日々の業務自動化の旅を、ぜひ快適に進めていってくださいね。次回の解説もお楽しみに!