ADODB.Stream で BOM なし UTF-8 のテキストファイルを書き出す

前回、ADODB.Stream を使って UTF-8 でファイルの読み書きを行った。しかしこのとき書き出されるテキストファイルは BOM 付き UTF-8 になってしまう。

そこで今回は、BOM なし UTF-8 のテキストファイルを書き出すよう、前回の VBScript を改善してみる。

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

' 一時書き出しファイルの指定 (テキストモードで BOM 付き UTF-8 を一時的に保持しておく)
Dim preOut
Set preOut = CreateObject("ADODB.Stream")
preOut.Type = 2
preOut.Charset = "UTF-8"
preOut.Open

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

' バイナリモードにする
preOut.Position = 0
preOut.Type = 1    'バイナリモードにする
preOut.Position = 3    ' 先頭3バイト = BOM をスキップする

' バイナリデータを読み込む
Dim bin
bin = preOut.Read    ' バイナリモードでないと Read できない

' 書き出しファイルの指定 (読み込んだバイナリデータをバイナリデータとしてファイルに出力する)
Dim output
Set output = CreateObject("ADODB.Stream")
output.Type = 1
output.Open
output.Write(bin)

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

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

大きな変更点は、テキストデータを書き込む対象を変数 output から preOut というものに変えた。そしてテキストモードでテキストを書き込んでいた preOut を最後にバイナリモードに変え、BOM を飛ばすために preOutPosition3 ズラしている。この状態で変数 output にバイナリデータのまま書き出し、ファイルを保存している。

これで BOM なし UTF-8 が書き出せる。本当に BOM なしになっているかどうか確かめたい場合は、以下のような方法で検証可能。

参考