概要
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);
出力結果
おわり。