VBScript で UTF-8 のテキストファイルを読み込む・書き出す

過去に FileSystemObject を使って、Shift-JIS や UTF-16 でエンコードされたテキストファイルの読み書きはできた。

今回は、HTML5 時代のデフォルトといえる、UTF-8 でテキストの読み書きをしてみる。

CreateTextFileの第3引数をtrueにするとUTF-16でファイルを作る。falseにするとShift_JIS。UTF-8で作ることはできない。UTF-8で作りたいときはFileSystemObjectではなくADODB.Streamを使う。

ということで、ADODB.Stream というものを使うと良いらしい。

今回は UTF-8 でエンコードされている inputText.txt から1行ずつテキストを読み込み、同じく UTF-8 の outputText.txt を新規作成してテキストを書き込む、というサンプル。文字列置換やら何やらは一切していないので、実際は input.ReadText(-2) あたりで取得した文字列をよしなにして output.WriteText するイメージか。

' 読み込みファイルの指定 (相対パスなのでこのスクリプトと同じフォルダに置いておくこと)
Dim input
Set input = CreateObject("ADODB.Stream")
input.Type = 2    ' 1 : バイナリ・2 : テキスト
input.Charset = "UTF-8"    ' 文字コード指定
input.Open    ' Stream オブジェクトを開く
input.LoadFromFile "inputText.txt"    ' ファイルを読み込む

' 書き出しファイルの指定 (今回は新規作成する)
Dim output
Set output = CreateObject("ADODB.Stream")
output.Type = 2
output.Charset = "UTF-8"
output.Open

' 読み込みファイルから1行ずつ読み込み、書き出しファイルに書き出すのを最終行まで繰り返す
Dim records
Do Until input.EOS
  Dim lineStr
  lineStr = input.ReadText(-2)    ' -1 : 全行読み込み・-2 : 一行読み込み
  output.WriteText lineStr, 1    ' 0 : 文字列のみ書き込み・1 : 文字列 + 改行を書き込み
Loop

' 書き出しファイルの保存
output.SaveToFile "outputText.txt", 2    '1 : 指定ファイルがなければ新規作成・2 : ファイルがある場合は上書き

' Stream を閉じる
input.Close
output.Close

このやり方だと「BOM 付き UTF-8」になる

こうして作成した outputText.txt は、BOM 付きの UTF-8 になってしまう。ADODB.Stream の設定で BOM なしにはできないので、一旦バイナリに変換して先頭3バイト (Byte Order Mark 部分) を飛ばして書き直す、という処理をしてやる必要がある。この手順は別途解説する。

参考