[VBA] ADODB.StreamでBOMなしUTF-8のファイルを作成する方法
ADODB.StreamオブジェクトのSaveToFileメソッドでUTF-8形式のファイルを作成した場合、ファイルの先頭にBOM(Byte Order Mark)が付加されてしまいます。これを解決するための方法を整理します。
今回のいきさつは、
仕事でVBAを使ってミドルウェアの設定コマンドを自動生成するツールを作成し、生成されたコマンドをLinuxサーバー上で実行したところエラーになったことです。テキストベースでみても不備はなかったんですが、バイナリデータをみると意味不明なコードが紛れ込んでいました。
調べたところBOMコードが付加されていることが原因でコマンド実行時にエラーになっていたようです。
ADODB.StreamオブジェクトとBOMが付与されてしまうので、先頭の3byteを除外してテキスト出力することでこれを解決します。
ロジックとしては、下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Sub saveFile(fileName, text) ' ADODB.Streamを作成 Dim stream : Set stream = CreateObject("ADODB.Stream") ' 1.最初にtext-modeでUTF-8で書き込む stream.Type = 2 ' adTypeText stream.Charset = "UTF-8" stream.Open() stream.WriteText(text) ' 2.Postionsを0にして、バイナリモードにする stream.Position = 0 stream.Type = 1 ' adTypeBinary ' 3.Positionを3にして読込みBOM分の3バイトを除外 stream.Position = 3 Dim bin : bin = stream.Read() stream.Close() ' BOMを除外したバイナリデータをファイルに出力する Dim restream : Set stream = CreateObject("ADODB.Stream") restream.Type = 1 ' dTypeBinary restream.Open() restream.Write(bin) restream.SaveToFile fileName, 2 ' force overwrite restream.Close() End Sub |