こんにちは! 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のファイル操作の基本はもうバッチリですよ!
日々の業務自動化の旅を、ぜひ快適に進めていってくださいね。次回の解説もお楽しみに!
