VBAで文字コードを指定してファイル出力
文字コードを指定してBOM無しファイルで出力する必要があったためその備忘録です。
概要
- 文字コード:UTF-8
- BOM無し
- CSVファイル
要件はこんな感じです。出力ファイルは特段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を使って
行末についているゴミを削除?
試してみたらビンゴでした。
うん、スッキリ
参考サイト様
- https://qiita.com/kou_tana77/items/66b14c7649792c9703d8 🔗
- http://d.hatena.ne.jp/rezelkht/20130730/1375146838 🔗
- http://d.hatena.ne.jp/niemands/ 🔗
- 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 🔗
- https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/eos-property 🔗
雑感
システムが違えば扱ってる文字コードも全然ちがったり
DBに合わせて文字コード変換したりと
いろんなところに気を配らないと行けなくて大変ですね。