CSV形式でユーザーリストをエクスポートする際、nameにASCII文字と数字以外の文字が含まれていると文字化けが発生します。
この問題に対処するために、2つの解決策を見つけました。
-
Excelで新しいXLSXファイルを作成し、「テキスト/CSVから」オプションを使用してデータをインポートし、ファイルの発信元を「Unicode (UTF-8)」に調整します。
-
Notepad++を使用してCSVファイルを開き、エンコーディングを「UTF-8」から「UTF-8-BOM」に変更します。
結果:
これら両方の解決策は、症状を解決するものの、根本原因に対処していません。
さらに調査した結果、この問題に対する長期的な解決策の可能性が見つかりました。
// 'body'をデータ行、'header'をヘッダー行とするCSVを生成するプロセス。
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);
// Excelは、ファイルがUTF-8エンコードされていることを示すためにバイトオーダーマーク(BOM)を必要とします。
const BOM = Buffer.from('\uFEFF');
// 生成されたCSVコンテンツとBOMヘッダーを連結します。
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);
// 結果のバッファを文字列に変換して返します。
return bomCsv.toString();
// 返された文字列がダウンロードされ、Excelで開かれると、スプレッドシートに中国語コンテンツが正しく表示されます。
要するに、ExcelはCSVファイルのエンコーディングを指定するためのメタデータを必要とします。Microsoftはこの目的のためにBOM(バイトオーダーマーク)ヘッダーを導入しました。このヘッダーは他のスプレッドシートソフトウェアでは無視される可能性がありますが、Excelにとっては非常に重要です。ソフトウェア間の互換性を確保するために、CSV生成中にBOMヘッダーを含めることが不可欠です。
来期のバージョンでこの解決策を組み込む予定はありますか?そうすることで、言語サポートが拡大し、バグの発生が減少する可能性があります。
この件にご注意いただきありがとうございます。
参考:
https://www.zhihu.com/question/21869078/answer/350728339



