¿Cuál es la diferencia entre UTF-8 y UTF-8 con BOM?
Respuestas
¿Demasiados anuncios?El BOM UTF-8 es una secuencia de bytes al inicio de un flujo de texto (0xEF, 0xBB, 0xBF
) que permite al lector adivinar de manera más confiable que un archivo está codificado en UTF-8.
Normalmente, el BOM se utiliza para señalar la endianness de una codificación, pero como la endianness es irrelevante para UTF-8, el BOM es innecesario.
Según el estándar Unicode, el BOM para archivos UTF-8 no se recomienda:
2.6 Esquemas de Codificación
... El uso de un BOM no es ni requerido ni recomendado para UTF-8, pero puede encontrarse en contextos donde los datos UTF-8 son convertidos desde otras formas de codificación que usan un BOM, o donde el BOM es usado como una firma UTF-8. Consulte la subsección "Marca de Orden de Bytes" en Sección 16.8, Especiales, para más información.
Las otras excelentes respuestas ya explicaron que:
- No hay diferencia oficial entre UTF-8 y UTF-8 con BOM
- Una cadena UTF-8 con BOM comenzará con los tres siguientes bytes.
EF BB BF
- Esos bytes, si están presentes, deben ser ignorados al extraer la cadena del archivo/fluido.
Pero, como información adicional, el BOM para UTF-8 podría ser una buena manera de "oler" si una cadena fue codificada en UTF-8... O podría ser una cadena legítima en cualquier otra codificación...
Por ejemplo, los datos [EF BB BF 41 42 43] podrían ser:
- La cadena legítima ISO-8859-1 "ABC"
- La cadena legítima UTF-8 "ABC"
Por lo tanto, aunque puede ser útil reconocer la codificación del contenido de un archivo al mirar los primeros bytes, no deberías confiar en ello, como se muestra en el ejemplo anterior
Las codificaciones deben ser conocidas, no adivinadas.
Hay al menos tres problemas al poner un BOM en archivos codificados en UTF-8.
- Los archivos que no contienen texto ya no están vacíos porque siempre contienen el BOM.
- Los archivos que contienen texto dentro del subconjunto ASCII de UTF-8 ya no son ASCII porque el BOM no lo es, lo que hace que algunas herramientas existentes fallen, y puede ser imposible para los usuarios reemplazar esas herramientas heredadas.
- No es posible concatenar varios archivos juntos porque cada archivo ahora tiene un BOM al principio.
Y, como otros han mencionado, no es ni suficiente ni necesario tener un BOM para detectar que algo es UTF-8:
- No es suficiente porque una secuencia de bytes arbitraria puede empezar con la secuencia exacta que constituye el BOM.
- No es necesario porque simplemente puedes leer los bytes como si fueran UTF-8; si eso tiene éxito, es, por definición, UTF-8 válido.
¿Cuál es la diferencia entre UTF-8 y UTF-8 sin BOM?
Respuesta corta: En UTF-8, un BOM está codificado como los bytes EF BB BF
al principio del archivo.
Respuesta larga:
Originalmente, se esperaba que Unicode se codificara en UTF-16/UCS-2. El BOM fue diseñado para esta forma de codificación. Cuando tienes unidades de código de 2 bytes, es necesario indicar en qué orden están esos dos bytes, y una convención común para hacer esto es incluir el carácter U+FEFF como una "Marca de Orden de Bytes" al principio de los datos. El carácter U+FFFE está permanentemente sin asignar para que su presencia pueda usarse para detectar el orden de bytes incorrecto.
UTF-8 tiene el mismo orden de bytes independientemente de la endianness de la plataforma, por lo que no es necesario un byte order mark. Sin embargo, puede ocurrir (como la secuencia de bytes EF BB FF
) en datos que se convirtieron a UTF-8 desde UTF-16, o como una "firma" para indicar que los datos son UTF-8.
¿Cuál es mejor?
Sin BOM. Como respondió Martin Cote, el estándar Unicode no lo recomienda. Causa problemas con software que no es consciente del BOM.
Una mejor manera de detectar si un archivo es UTF-8 es realizar una verificación de validez. UTF-8 tiene reglas estrictas sobre qué secuencias de bytes son válidas, por lo que la probabilidad de un falso positivo es insignificante. Si una secuencia de bytes parece UTF-8, probablemente lo sea.
UTF-8 con BOM se identifica mejor. He llegado a esta conclusión de la manera más difícil. Estoy trabajando en un proyecto donde uno de los resultados es un archivo CSV, que incluye caracteres Unicode.
Si el archivo CSV se guarda sin BOM, Excel piensa que es ANSI y muestra caracteres ilegibles. Una vez que agregas "EF BB BF" al principio (por ejemplo, volviéndolo a guardar con Notepad en UTF-8; o Notepad++ en UTF-8 con BOM), Excel lo abre correctamente.
Se recomienda añadir el carácter BOM a archivos de texto Unicode según el RFC 3629: "UTF-8, un formato de transformación de ISO 10646", noviembre de 2003 en https://www.rfc-editor.org/rfc/rfc3629 (esta última información encontrada en: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html)