Skip to content
戻る

VBAでUTF-8 BOM無しファイル出力

Published:  at  10:10

VBAで文字コードを指定してファイル出力

文字コードを指定してBOM無しファイルで出力する必要があったためその備忘録です。

概要

要件はこんな感じです。出力ファイルは特段CSVでなくてもいいです。
大事なのは文字コードUTF-8でBOM無しで出力すること。

目次

ソース

https://gist.github.com/757c053219e64645846b916b0d1426e5 🔗

※ADODBを使用するときは参照設定で参照してください。

今回のソースでは簡略化するために文字列を渡して
その文字列を単純に書き込んでいますが、
ループで回してやれば1行ずつ書き込む形式になります。

出力形式はほかの言語でも似たようなものなので特段ありません。

BOMとは何ぞや

プログラムがテキストデータを読み込む時、その先頭の数バイトからそのデータがUnicodeで表現されていること、また符号化形式(エンコーディング)としてどれを使用しているかを判別できるようにしたものである。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF 🔗

Unicodeかどうか判断するためのものらしい、UTF-16の場合はBEかLEの判定
なんでソース中で3バイト読み飛ばしてるのかって言うと
先頭に「0xEF 0xBB 0xBF」の3バイトが付くらしい

キャレット位置は0からスタートなので0, 1, 2とカウントして3バイト目から読み込む
そうするとBOMである3バイトの「0xEF 0xBB 0xBF」を読み飛ばすことができる

EOSとは何ぞや

ファイル読み込み時にも使用していたEOS
EOFの親戚かな?くらいにいつも思っていた。

BOMを潰した分、後ろにゴミが残るので、SetEOSで取り除く
https://qiita.com/kou_tana77/items/66b14c7649792c9703d8 🔗

後ろにゴミが残るってどう言うことっすか…

EOSプロパティ
現在の位置がストリームの最後にあるかどうかを示すブール値を返します。EOSは、ストリームにバイトがなくなるとTrueを返します。現在の位置の後にさらにバイトがある場合はFalseを返します。
https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/eos-property 🔗

調べてみるとEnd Of Streamの略らしい

キャレット位置が0バイト地点から書き込みを行った場合
挿入モードで書き込みが行われ先頭3バイトのBOMがそのまま行末に行くという認識でよろしい?
なので書き込み時点でのキャレット位置を行末とするためにSetEOSを使って
行末についているゴミを削除?

試してみたらビンゴでした。

うん、スッキリ

参考サイト様

雑感

システムが違えば扱ってる文字コードも全然ちがったり
DBに合わせて文字コード変換したりと
いろんなところに気を配らないと行けなくて大変ですね。



前の記事
C#基礎 値型と参照型
次の記事
C#で文字列のCSVデータをDataGridViewに表示する。