概要
業務でCSVファイル出力を試していて、「Excelで開くときの文字化け対策」とだけ説明が記載された不思議な変数がありました。
const bom = new Uint8Array([0xEf, 0xBB, 0xBF]);
ん?
BOMとは
私の脳みそが一瞬爆発した音ではありません。
BOMとは「byte order mark(バイト順マーク)」の略称でUnicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことです。
その数バイトのデータというのが先ほどのコードに記載されていた変数bomの正体です。
要するに、bomが付加されたファイルはUnicodeであることとUnicodeの符号化の種類(UTF-8とかUTF-16とか)を判別することができます。
ちなみにBOMが付加されていないファイルはUTF-8Nという名称で区別されることがあります。
なぜ文字化けするのか
Excelの標準文字コードはShift-JISですが、入力ファイルをUTF-8として解釈することもできます。
ただし、ブラウザからダウンロードされたCSVファイルは「UTF-8N」であることが多く、Excelが認識している文字コードの違いにより文字化けの原因になるようです。
ちなみにBOMを付加しても、Excel上では文字として表示されません。
最後に
なんだこれをそのままにしない精神だけは大切にしよう。
参考サイト
バイト順マーク - Wikipedia
BOMの地雷を踏み抜かない正しい文字コードとの接し方
javascript で作成したCSVファイルをエクセルで表示可能にする - Qiita