【Node.js】BlobなしでBOM付きUTF-8ファイルを作る

この記事は最新更新日から、2年以上経過しています。

概要

Nodeを使ったJavaScriptで、せっかく作ったCSVファイルを、Excelで開いたら文字化けして落胆した瞬間はありませんか。私はありました。
会社の事情でなぜかBlobが使えないときでもいけます。

動作環境

Node.js v14.15.4

参考

Adding UTF-8 BOM to string/Blob
I need to add a UTF-8 byte-order-mark to generated text data on client side. How do I do that?Using new Blob() yields 'ï...
fs.writeFileの使い方。Node.jsでファイルを書き込み
fs.writeFileとfs.writeFileSyncの使い方の例を分かりやすく簡単に説明していきます。fsはNode.jsでファイルを書き込むために使うライブラリです。最も単純な使い方は次の通りです。fs.writeFileは非同期処...

コード

UTF-8ファイルでも、BOMつければ文字化けしないらしいとわかったものの、検索してもBlob使うやつがとても多い…。
ArrayBuffer使うやつは大変そうだし。Excelで文字化けしないだけでいいんだけどな…。
などと思っていましたが、最近ナイスな解決策を知りました。先頭に文字列でBOM「\ufeff」をつければいけるそうです。

なので、ファイルシステムを使ってcsvを適当に作ってファイルを出力してみます。
検証のためにBOMありなしでファイルを分けて出力してみます。

const fs = require('fs');

// 適当にCSVの中身を作る
let csvFile = '';
csvFile += 'aaa,bbb,ccc' + '\r\n';
csvFile += 'aaa1,bbb1,ああああ' + '\r\n';
csvFile += 'aaa2,bbb2,あいうえお' + '\r\n';

// BOM
const BOM = '\ufeff';

// ファイルの先頭にBOMをつけるとUTF-8(BOM付き)になるらしい
fs.writeFileSync( "output_BOMあり.csv" , BOM + csvFile);
fs.writeFileSync( "output_BOMなし.csv" , csvFile);

出力結果


ほんとだ…。

おわり。