¿Deben los archivos CSV UTF-8 contener una BOM (marca de orden de bytes)?

37

Nuestro software de línea de negocio permite al usuario guardar ciertos datos como CSV . Dado que hay muchos formatos diferentes (todos llamados "CSV") en uso en la naturaleza, estamos tratando de decidir cómo debería ser el "formato predeterminado".

  • Con respecto a los separadores de línea / campo y al escape, hay un estándar que podemos usar: RFC 4180 .

  • Con respecto a la codificación de texto, UTF-8 parece haber surgido en la última década como el "formato de archivo de texto predeterminado", por lo que lo utilizaremos.

La única pregunta que queda abierta es: ¿Deberíamos agregar una lista de materiales al comienzo o no? He leído múltiples opiniones y pros / contras sobre el uso de listas de materiales en general, pero ¿hay alguna recomendación "oficial" o al menos algún tipo de consenso de la comunidad sobre el uso de listas de materiales en los archivos CSV?

Heinzi
fuente
77
Si tiene una lista de materiales, entonces no es UTF-8. Pero, ¿qué formato quieren los programas? Si necesitan una lista de materiales (principalmente micro-sloth), entonces debe agregar una, pero UTF-8 + BOM ≠ UTF-8.
ctrl-alt-delor
3
Aunque CSV es aparentemente más fácil de generar, hay tantos problemas de compatibilidad, especialmente si se desvía de ASCII puro de 7 bits, que le recomendaría que genere XLSX real si el objetivo es que los usuarios lo abran en Excel (en lugar de volver a importarlo en algún otro software, en cuyo caso tendrá que dar opciones para separadores, codificación, etc.). Existen bibliotecas para la mayoría de los idiomas, y le ahorrará a usted y a sus usuarios mucho tiempo.
jcaron
2
Si toma la ruta CSV, verifique qué sucede cuando abre el archivo tanto en Mac como en PC, idealmente con varias versiones de Excel. También tenga en cuenta que algunas versiones de Excel no se comportan igual cuando hace doble clic en el archivo para abrirlo o abrir el archivo a través del menú.
jcaron
2
¿Por qué importa si se abre correctamente en Excel? Nada en la pregunta indica que Excel necesita poder analizar el archivo generado ...
rubenvb

Respuestas:

55

No para UTF-8 , pero vea las diversas advertencias en los comentarios.

Es innecesario (UTF-8 no tiene orden de bytes) a diferencia de UTF-16/32 y no se recomienda en el estándar Unicode . También es bastante raro ver UTF-8 con BOM "en la naturaleza", por lo que, a menos que tenga una razón válida (por ejemplo, como se comentó, trabajará con un software que espera la BOM), recomendaría el enfoque sin BOM .

Wikipedia menciona principalmente software de Microsoft que fuerza y ​​espera una lista de materiales, pero a menos que esté trabajando con ellos, no la use.

Kayaman
fuente
28
También hay un software extendido que requiere una lista de materiales: Excel necesita una lista de materiales para identificar correctamente un archivo CSV como UTF-8 en lugar de "ANSI", es decir, el entorno local de compatibilidad. (Pero Excel también hace cosas extrañas al guardar dicho archivo, por lo que recomendamos a los usuarios que usen nuestra exportación "real" de Excel en lugar de la exportación CSV si desean abrir el archivo con Excel).
Heinzi
21
@Heinzi Hace mucho tiempo aprendí que realmente no puedes ganar cuando trabajas con CSV y Excel. Es simplemente un pésimo lector CSV. Lástima que sea lo que los usuarios normales esperan.
tubería
99
@Voo: Requerir una lista de materiales para UTF-8 ciertamente viola el estándar, teniendo en cuenta que " no es obligatorio ni recomendado ".
Deduplicador
12
@Deduplicator: los sistemas MS-DOS y Windows tienen una gran base de archivos de texto heredados en codificaciones distintas a UTF-8. Las aplicaciones de calidad permiten al usuario especificar cómo se codifica un archivo de texto al abrirlo, pero a menudo incluyen una opción "automática". Si un usuario selecciona "UTF-8", un archivo UTF-8 se abrirá correctamente con o sin una lista de materiales. Si un usuario selecciona "auto", algunos archivos UTF-8 que no tienen una lista de materiales pueden ser identificados erróneamente como usando alguna otra codificación. No estoy seguro de qué esperaría que una aplicación hiciera de manera diferente, ya que los archivos que están "mal identificados" podrían ser bit por bit idénticos a ...
supercat
77
@Voo: Eso entra en conflicto con muchos otros requisitos específicos de formato donde una lista de materiales es ilegal. Por ejemplo, un script de shell con una lista de materiales antes de la #!no es válida. En el mejor de los casos, una lista de materiales en UTF-8 está "permitida, cuando ningún requisito específico de formato / aplicación lo impide", no "permitida", y como tal no debe usarse. Los estándares son realmente claros acerca de lo que NO DEBE.
R ..
8

Todavía no existe una convención generalizada AFAIK, aunque ciertamente UTF-8 ahora es generalmente aceptado.

La lista de materiales es un artefacto horrible:

Es invisible (espacio de ancho cero).

Algún software puede romperse en el nombre de la primera columna que no solo contiene letras, sino esa extraña lista de materiales al frente.

La línea de encabezado podría copiarse para las líneas de valor que corrompen el primer valor.

Algunos programas de Windows solo lo necesitan para distinguir entre una de las codificaciones ANSI utilizadas por esa máquina local de Windows y UTF-8. Bloc de notas, Excel.

Entonces, lo triste es que uno debe apoyar la lista de materiales. Quizás opcional.

Utilice un esquema de nomenclatura para los archivos (...- utf8.txt, ...- utf8bom.txt).


En muchos casos podríamos usar HTML como alternativa de exportación. Esto permite configurar la codificación en el archivo. Una característica adicional es el color de fondo / primer plano de filas y celdas. Lo que aumenta la calidad de la exportación.

Joop Eggen
fuente
15
Si el formato "aumenta la calidad de la exportación" depende en gran medida del uso previsto del archivo. CSV se usa a menudo como un formato simple legible por máquina , y hacer que el destinatario analice HTML en su lugar sería una gran desventaja en ese caso.
IMSoP
55
Si elige un esquema de nombres, tenga en cuenta a la audiencia. -utf8-windows.csves mejor. Casi todo el mundo sabe qué es Windows, en el contexto de las computadoras, pero muchos menos usuarios saben qué es una marca de orden de bytes.
MSalters
2
@Davislor sí, si es un estándar conocido ampliamente comunicado. De lo contrario, aparecerán informes de errores sobre tschüßbasura, mientras que tschüßdeberían haberse escrito. En StackOverflow, muchos errores de TI son sobre codificaciones. Los usuarios finales también experimentarán problemas.
Joop Eggen
3
@JoopEggen "Estándar conocido ampliamente comunicado" ¿en qué comunidad exactamente? He estado desarrollando software durante casi 10 años y nunca lo he visto, ni siquiera en Windows, y ciertamente no en Linux u OSX, donde casi siempre se trata con utf-8.
Cubic
1
@JustinTime sí, incluso desde hace algunos años, pero no antes. Los desarrolladores de MS no son tan malos (cumplimiento de Posix, ahora soporte UTF-8).
Joop Eggen