Los archivos CSV exportados presentan caracteres ilegibles

Al exportar la lista de usuarios en formato CSV, si el nombre contiene caracteres distintos de ASCII y números, se generan caracteres corruptos:

Encontré dos soluciones para abordar este problema:

  1. Crear un nuevo archivo XLSX en Excel, importar los datos usando la opción “Desde Texto/CSV” y ajustar el Origen del archivo a Unicode (UTF-8).


    image

  2. Utilizar Notepad++ para abrir el archivo CSV y cambiar la Codificación de UTF-8 a UTF-8-BOM.

Resultado:

A pesar de su efectividad para resolver el síntoma, ambas soluciones abordan el problema sin atacar su causa raíz.


Tras investigar más a fondo, he encontrado una posible solución a largo plazo para este problema:

// Proceso para generar un CSV, donde 'body' representa las filas de datos y 'header' la fila de encabezado.
const csv = body.reduce((prev, current) => `${prev}\r\n${current}`, header);

// Excel requiere una Marca de Orden de Byte (BOM) para indicar que el archivo está codificado en UTF-8.
const BOM = Buffer.from('\uFEFF');

// Concatenar el encabezado BOM con el contenido CSV generado.
const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]);

// Convertir el búfer resultante a una cadena y devolverla.
return bomCsv.toString();

// Una vez que la cadena devuelta se descarga y se abre con Excel, mostrará correctamente el contenido chino en la hoja de cálculo.

En esencia, Excel requiere metadatos para especificar la codificación de los archivos CSV. Microsoft introdujo el encabezado BOM (Byte Order Mark) para este propósito. Si bien este encabezado puede ser ignorado por otro software de hoja de cálculo, es de gran importancia para Excel. Para garantizar la compatibilidad entre software, es esencial incluir el encabezado BOM durante la generación del CSV.

Me pregunto si su equipo tiene planes de incorporar esta solución en la próxima versión. Hacerlo podría ampliar el soporte de idiomas y reducir la aparición de errores.

¡Gracias por su atención a este asunto!

Referencia:
https://www.zhihu.com/question/21869078/answer/350728339

1 me gusta