При экспорте списка пользователей в формате CSV, если поле name содержит символы, отличные от ASCII-символов и цифр, возникает проблема с некорректным отображением символов:
Я нашел два способа решения этой проблемы:
-
Создать новый файл XLSX в Excel, импортировать данные с помощью опции «Из текста/CSV» и установить источник файла как
Unicode (UTF-8).
-
Использовать 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



