В экспортированных CSV-файлах некорректные символы

При экспорте списка пользователей в формате CSV, если поле name содержит символы, отличные от ASCII-символов и цифр, возникает проблема с некорректным отображением символов:

Я нашел два способа решения этой проблемы:

  1. Создать новый файл XLSX в Excel, импортировать данные с помощью опции «Из текста/CSV» и установить источник файла как Unicode (UTF-8).


    image

  2. Использовать Notepad++ для открытия CSV-файла и изменить кодировку с UTF-8 на UTF-8-BOM.

Результат:

Несмотря на эффективность этих методов в устранении симптомов, они не решают проблему в корне.


В ходе дальнейшего исследования я нашел потенциальное долгосрочное решение этой проблемы:

// Процесс генерации CSV, где 'body' представляет строки данных, а 'header' — строку заголовка.
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// Excel требует наличия метки порядка байтов (BOM) для указания, что файл закодирован в UTF-8.
const BOM = Buffer.from('\uFEFF');

// Объединение заголовка BOM с сгенерированным содержимым CSV.
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// Преобразование результирующего буфера в строку и возврат её.
return bomCsv.toString();

// После загрузки и открытия возвращаемой строки в Excel китайский контент будет корректно отображаться в таблице.

По сути, Excel требует метаданных для указания кодировки CSV-файлов. Microsoft ввела заголовок BOM (метка порядка байтов) для этой цели. Хотя этот заголовок может игнорироваться другим программным обеспечением для работы с таблицами, он имеет критическое значение для Excel. Для обеспечения совместимости между различными программами необходимо включать заголовок BOM при генерации CSV.

Меня интересует, планирует ли ваша команда внедрить это решение в следующей версии? Это могло бы расширить поддержку языков и снизить количество ошибок.

Спасибо за ваше внимание к этому вопросу!

Ссылка:
https://www.zhihu.com/question/21869078/answer/350728339

1 лайк