【Node.js】BOMつきUTF-8をJSON.parse()で読み込みたいだけの人生だった
※2019年頃に他のブログで書いた記事の移植版です。
なんか最近いろんなプログラミング言語でJSON扱う敷居が低くなってきたので、ネットワーク越しじゃなくてローカルファイルでデータを受け渡す時も、割とJSONを使ったりする。超便利なんよね。
こないだ他の人が作ったアプリが吐き出したJSON読む案件があって、こちとらElectronでデスクトップアプリ作ってるので、ファイル読み込んでからJSON.parse()すれば楽勝じゃね?って思ってたわけ。
Uncaught SyntaxError: Unexpected token in JSON at position 0
そしたら「グエー!ファイルの先頭に変なんあるよ!!」っぽい事を言われて、パースしてくんない。まさかJSONのデータフォーマット腐っとるんちゃうか?と思ってチェッカーかけたけども、問題なし。不審に思いながら、バイナリエディタでファイル開いてみたところ、データの先頭に「EF BB BF」が入ってた。うわぁ、BOMつきUTF-8だこれ!(WEB屋時代のトラウマ)
fs.readFile(file, function(err, data){
if(err){
console.log("error:"+err);
throw err;
} else {
if( // BOMつきなのか?
(data[0] == 0xEF) &&
(data[1] == 0xBB) &&
(data[2] == 0xBF)
){
// そうだ!
data = data.slice(3);
}
// やったねたえちゃん!パースができるよ!
let json = JSON.parse(data);
}
});
でもまぁ、相手方に「BOMつけんのやめれー」というのもアレなので、BOM付いてても読み込めるように対応してみた。BOMはデータの先頭に識別用のデータが3バイトあるだけなんで、愚直に先頭の3Byte削るだけの力技対応。もちろん、「文字コードはUTF-8である」という前提だけれども。
その昔、サーバサイドのお仕事やってた時に、後輩がWindows付属のメモ帳でファイル編集してBOMつけて騒ぎになる事がちょいちょいあったっけなぁ。
今ではWin10付属のメモ帳がBOM無し保存デフォになってるらしい。使わないけど・・・。まあ、世界中で不幸な事故が少しでも減ってくれたらおじさんは嬉しい限りだワー。
この記事が気に入ったらサポートをしてみませんか?