Arquivos CSV exportados têm caracteres ilegíveis

Ao exportar a lista de usuários no formato CSV, se o name contiver caracteres que não sejam ASCII e números, o resultado são caracteres ilegíveis:

Encontrei duas soluções para resolver este problema:

  1. Crie um novo arquivo XLSX no Excel, importe os dados usando a opção “Do Texto/CSV” e ajuste a Origem do Arquivo para Unicode (UTF-8).


    image

  2. Utilize o Notepad++ para abrir o arquivo CSV e altere a Codificação de UTF-8 para UTF-8-BOM.

Resultado:

Apesar de serem eficazes na resolução do sintoma, ambas as soluções abordam o problema sem tratar sua causa raiz.


Após mais pesquisas, deparei-me com uma solução potencial de longo prazo para este problema:

// Processo para gerar um CSV, com 'body' representando as linhas de dados e 'header' como a linha de cabeçalho.
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// O Excel requer um Byte Order Mark (BOM) para indicar que o arquivo está codificado em UTF-8.
const BOM = Buffer.from('\uFEFF');

// Concatena o cabeçalho BOM com o conteúdo CSV gerado.
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// Converte o buffer resultante em uma string e a retorna.
return bomCsv.toString();

// Assim que a string retornada for baixada e aberta com o Excel, ela exibirá o conteúdo chinês corretamente na planilha.

Em essência, o Excel requer metadados para especificar a codificação dos arquivos CSV. A Microsoft introduziu o cabeçalho BOM (Byte Order Mark) para esse fim. Embora este cabeçalho possa ser ignorado por outros softwares de planilha, ele é de extrema importância para o Excel. Para garantir a compatibilidade entre softwares, incluir o cabeçalho BOM durante a geração do CSV é essencial.

Gostaria de saber se sua equipe tem planos de incorporar essa solução na próxima versão? Fazer isso poderia potencialmente expandir o suporte a idiomas e reduzir a ocorrência de bugs.

Obrigado pela sua atenção a este assunto!

Referência:
https://www.zhihu.com/question/21869078/answer/350728339

1 curtida