created: 2020-10-13T03:14:06.000Z
BOMつきUTF-8とjsについて
まずBOMについて
BOMとはもともとはリトルエンディアンとビッグエンディアンのどちらかを判別するためにファイルの先頭につくバイト列のこと。
本来はUTF-8ではエンディアンにかかわらず同じ内容となるようだが、エクセルなどで開くときにBOMがついていないと文字化けしてしまうことがあるので、エクセルで読まれる前提のcsvファイルなどはBOMつきUTF-8を生成する必要がある
BOM付きか否かの確認方法
odで確認できる
$ head -1 ~/_.csv | od -t x1
0000000 ef bb bf e3 83 a1 e3 83 87 e3 82 a3 e3 82 a2 49
0000020 44 2c e3 83 a1 e3 83 87 e3 82 a3 e3 82 a2 2c e5
0000040 aa 92 e4 bd 93 e7 a4 be 49 44 2c e5 aa 92 e4 bd
fileコマンドでも (with BOM)
の有無で確認できる
$ file ./*.csv
/tmp/_.csv: UTF-8 Unicode (with BOM) text
jsでBOMをつける方法
csvをダウンロードさせるとして、blobを生成するときに先頭にBOMのバイト列をつけてやればよい
const bom = new Uint8Array([0xef, 0xbb, 0xbf]);
const blob = new Blob([bom, str], {type: 'application/octet-stream'});
単純に "\uFEFF"
を連結するだけでも動作するようだ
const bom = "\uFEFF";
const blob = new Blob([bom, str], {type: 'application/octet-stream'});