BOMつきUTF-8をJSON.parse()で読み込めなかった

なんか最近いろんな言語でJSON扱う敷居が低くなってきたので、ファイルでデータを受け渡す時も割とJSONを使ったりする。こないだ他の人が作ったアプリが吐き出したJSON読む案件があって、こちとらElectron(Javascript)でデスクトップアプリ作ってるので、ファイル読み込んでからJSON.parse()すれば楽勝じゃね?てな感じでサクッとfs.readFile()やってみたわけですよ。

Uncaught SyntaxError: Unexpected token  in JSON at position 0

そしたら「ファイルの先頭に変なんあるよ!!」っぽい事を言われてパースしてくんない。まさかJSONのデータフォーマット腐っとるんちゃうか?と思ってチェッカーに入れたけども、問題なし。不審に思いながら、バイナリエディタでファイル開いてみたところ、データの先頭に「EF BB BF」が入ってた。うわぁ、BOMつきUTF-8だこれ!

でもまぁ「BOMつけんのやめれー」というのもアレなので、BOM付いてても読み込めるように対応してみた。BOMはデータの先頭に識別用のデータが3バイトあるだけなんで、愚直に先頭の3Byte削るだけでよさそうだ。もちろん、「文字コードはUTF-8である」という前提だけれども。

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);
    }
});

その昔、サーバサイドのお仕事やってた時に、Windows付属のメモ帳でファイル編集してBOMつけてバグって騒ぎになる事がちょいちょいあったっけなぁ。そういえばWin10付属のメモ帳がBOM無し保存できるようになるらしいわね。すげえ今更感だけど、世界中で不幸な事故が少しでも減ってくれたらおじさんは嬉しい限りだワー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)