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 を飛ばすために preOut
の Position
を 3
ズラしている。この状態で変数 output
にバイナリデータのまま書き出し、ファイルを保存している。
これで BOM なし UTF-8 が書き出せる。本当に BOM なしになっているかどうか確かめたい場合は、以下のような方法で検証可能。