Articulo de referencia

Marca de orden de bytes

La marca de orden de bytes ( BOM ) es un uso particular del código de caracteres Unicode especial, U+FEFF ESPACIO SIN SALTO DE ANCHO CERO , cuya aparición como un número mágico ...

La marca de orden de bytes ( BOM ) es un uso particular del código de caracteres Unicode especial, U+FEFF ESPACIO SIN SALTO DE ANCHO CERO , cuya aparición como un número mágico al comienzo de una secuencia de texto puede indicar varias cosas a un programa que lee el texto: [ 1 ]

  • el orden de bytes, o endianness , del flujo de texto en los casos de codificaciones de 16 bits y 32 bits;
  • el hecho de que la codificación del flujo de texto sea Unicode, con un alto grado de confianza;
  • ¿Qué codificación de caracteres Unicode se utiliza?

El uso de BOM es opcional. Su presencia interfiere con el uso de UTF-8 por parte de software que no espera bytes que no sean ASCII al inicio de un archivo, pero que de otro modo podría procesar el flujo de texto.

Unicode se puede codificar en unidades de enteros de 8, 16 o 32 bits. Para las representaciones de 16 y 32 bits, un ordenador que recibe texto de fuentes arbitrarias necesita saber en qué orden de bytes están codificados los enteros. La marca de orden de bytes (BOM) se convierte en un punto de código Unicode que no es un carácter si se intercambian sus bytes. Por lo tanto, el proceso que accede al texto puede examinar estos primeros bytes para determinar el orden de bytes, sin necesidad de ningún contrato o metadatos externos al flujo de texto. Generalmente, el ordenador receptor intercambiará los bytes a su propio orden de bytes, si es necesario, y ya no necesitará la BOM para el procesamiento.

La secuencia de bytes de la marca de orden de bytes (BOM) varía según la codificación Unicode (incluidas UTF-8 y otras fuera del estándar Unicode, como UTF-7 ; véase la tabla a continuación ), y es poco probable que alguna de estas secuencias aparezca al inicio de flujos de texto almacenados en otras codificaciones. Por lo tanto, colocar una BOM codificada al inicio de un flujo de texto puede indicar que el texto es Unicode e identificar el esquema de codificación utilizado. Este uso de la BOM se denomina «firma Unicode».

Uso

La marca de orden de bytes (BOM) es, simplemente, el punto de código Unicode U+FEFF ZERO WIDTH NO-BREAK SPACE , codificado en la codificación actual. Un archivo de texto que comienza con esos bytes sugiere que el archivo está codificado en UTF-16 big-endian. [ 2 ]FE FF

El nombre ZWNBSP ( espacio sin salto de ancho cero ) debe usarse si la marca de orden de bytes (BOM) aparece en medio de un flujo de datos. Unicode indica que debe interpretarse como un punto de código normal (es decir, un separador de palabras ), no como una BOM. Desde Unicode 3.2, este uso ha sido desaconsejado en favor de U+2060 WORD JOINER . [ 1 ]

El nombre Unicode 1.0 para este punto de código también es BYTE ORDER MARK. [ 3 ]

UTF-8

La representación UTF-8 de la BOM es la secuencia de bytes ( hexadecimal ) .EF BB BF

El estándar Unicode permite el BOM en UTF-8 , [ 4 ] pero no exige ni recomienda su uso. [ 5 ] UTF-8 siempre tiene el mismo orden de bytes, [ 6 ] por lo que su único uso en UTF-8 es indicar al inicio que el flujo de texto está codificado en UTF-8, o que se convirtió a UTF-8 desde un flujo que contenía un BOM opcional. El estándar tampoco recomienda eliminar un BOM cuando está presente, para que el intercambio entre codificaciones no pierda información y para que el código que depende de él siga funcionando. [ 7 ] [ 8 ] El IETF recomienda que si un protocolo (a) siempre usa UTF-8, o (b) tiene alguna otra forma de indicar qué codificación se está usando, entonces "DEBERÍA prohibir el uso de U+FEFF como firma". [ 9 ] Un ejemplo de no seguir esta recomendación es el protocolo Syslog de la IETF , que requiere que el texto esté en UTF-8 y también requiere la BOM. [ 10 ]

No utilizar una marca de orden de bytes (BOM) permite que el texto sea compatible con versiones anteriores de software diseñado para ASCII extendido . Por ejemplo, muchos lenguajes de programación permiten bytes que no son ASCII en literales de cadena , pero no al principio del archivo.

No es necesario un BOM para detectar la codificación UTF-8. UTF-8 es una codificación dispersa: una gran fracción de las posibles combinaciones de bytes no dan como resultado un texto UTF-8 válido. Es probable que los datos binarios y el texto en cualquier otra codificación contengan secuencias de bytes que no son válidas como UTF-8, por lo que la existencia de dichas secuencias no válidas indica que el archivo no es UTF-8, mientras que la ausencia de secuencias no válidas es una indicación muy fuerte de que el texto es UTF-8. Prácticamente la única excepción es el texto que contiene solo bytes en el rango ASCII, ya que esto podría ser una codificación de 7 bits no ASCII, pero esto es improbable en cualquier dato moderno e incluso en ese caso la diferencia con ASCII es mínima (como cambiar '\' por '¥').

Los compiladores e intérpretes de Microsoft [ 11 ] , y muchos programas de Microsoft Windows como el Bloc de notas (antes de Windows 10 Build 1903 [ 12 ] ) tratan el BOM como un número mágico obligatorio en lugar de usar heurísticas. Estas herramientas agregan un BOM al guardar texto como UTF-8 y no pueden interpretar UTF-8 a menos que el BOM esté presente o el archivo contenga solo ASCII. Windows PowerShell (hasta la versión 5.1) agregará un BOM al guardar documentos XML UTF-8. Sin embargo, PowerShell Core 6 ha agregado un -Encodingmodificador en algunos cmdlets llamado utf8NoBOM para que el documento se pueda guardar sin BOM. Google Docs también agrega un BOM al convertir un documento a un archivo de texto plano para su descarga.

UTF-16

En UTF-16U+FEFF , se puede colocar una BOM ( ) como los primeros bytes de un archivo o flujo de caracteres para indicar el orden de bytes (endianness) de todas las unidades de código de 16 bits del archivo o flujo. Si se intenta leer este flujo con un orden de bytes incorrecto, los bytes se intercambiarán, lo que generará el carácter U+FFFE, que Unicode define como un " no carácter " que nunca debería aparecer en un texto.

  • Si las unidades de 16 bits se representan en orden de bytes big-endian ("UTF-16BE"), la BOM es la secuencia de bytes ( hexadecimal ).FE FF
  • Si las unidades de 16 bits utilizan el orden little-endian ("UTF-16LE"), la BOM es la secuencia de bytes ( hexadecimal ).FF FE

Para los conjuntos de caracteres UTF-16BE y UTF-16LE registrados por la IANA , no se debe utilizar una marca de orden de bytes, ya que los nombres de estos conjuntos de caracteres ya determinan dicho orden.

La cláusula D98 de conformidad (sección 3.10) del estándar Unicode establece: «El esquema de codificación UTF-16 puede o no comenzar con una marca de orden de bytes (BOM). Sin embargo, cuando no hay BOM y en ausencia de un protocolo de nivel superior, el orden de bytes del esquema de codificación UTF-16 es big-endian». La existencia o no de un protocolo de nivel superior está sujeta a interpretación. Por ejemplo, se podría argumentar que los archivos locales de un ordenador cuyo orden de bytes nativo es little-endian se codifican implícitamente como UTF-16LE. Por lo tanto, la presunción de big-endian se ignora ampliamente. El estándar de codificación W3C / WHATWG utilizado en HTML5 especifica que el contenido etiquetado como «utf-16» o «utf-16le» debe interpretarse como little-endian «para gestionar el contenido desplegado». [ 13 ] Sin embargo, si hay una marca de orden de bytes, entonces esa BOM debe tratarse como «más autorizada que cualquier otra cosa». [ 14 ]

Sin una marca de orden de bytes (BOM), sigue siendo bastante fiable detectar si un texto es UTF-16 y cuál es su orden de bytes si el texto es suficientemente largo. Los caracteres del bloque de caracteres latinos básicos (U+0001 a U+007F) tienen un byte alto nulo (0x00); incluso en alfabetos no latinos, los saltos de línea y los espacios (que se incluyen en este bloque) se utilizan con frecuencia. Si los bytes nulos aparecen con mucha más frecuencia en posiciones pares del archivo, es probable que se trate de UTF-16 big-endian, y little-endian si aparecen con más frecuencia en posiciones impares.

UTF-32

Si bien se podría usar una marca de orden de bytes (BOM) con UTF-32 , esta codificación rara vez se utiliza para la transmisión. Por lo demás, se aplican las mismas reglas que para UTF-16 .

La marca de orden de bytes (BOM) para UTF-32 little-endian tiene el mismo patrón que la BOM de UTF-16 little-endian seguida de un carácter nulo (NUL) de UTF-16, un ejemplo inusual de una BOM con el mismo patrón en dos codificaciones diferentes. Los programadores que utilicen la BOM para identificar la codificación deberán decidir si es más probable que se trate de UTF-32 o UTF-16 con un carácter nulo al principio. UTF-32 se detecta fácilmente sin una BOM porque cada cuarto byte es nulo.

Marcas de orden de bytes mediante codificación

Esta tabla ilustra cómo se representa la BOM como una secuencia de bytes en varias codificaciones y cómo podrían aparecer esas secuencias en un editor de texto que interpreta cada byte como una codificación heredada ( Windows-1252 con notación de circunflejo para los controles C0 ):

  1. 1 2 3 4 5 6 7 Esto no es literalmente una marca de "orden de bytes", ya que una unidad de código en estas codificaciones es un byte y, por lo tanto, no puede tener bytes en un orden "incorrecto". Sin embargo, la BOM se puede usar para indicar la codificación del texto que la sigue. [ 6 ] [ 15 ]
  2. Seguido de38,39,2B, o2F(ASCII8,9,+o/), dependiendo de cuál sea el siguiente carácter.
  3. SCSU permite otras codificaciones de U+FEFF; la forma mostrada es la firma recomendada en UTR #6. [ 18 ]

Véase también

Referencias

  1. 1 2 "Preguntas frecuentes - UTF-8, UTF-16, UTF-32 y BOM" . Unicode.org . Consultado el 28 de enero de 2017 .
  2. «Carta con ajustes» . doi.org . Consultado el 17 de junio de 2026 .
  3. "Espacio sin interrupción de ancho cero (U+Feff)" .
  4. "El estándar Unicode 5.0, capítulo 2: Estructura general" (PDF) . pág. 36. Consultado el 29 de marzo de 2009. Tabla 2-4. Los siete esquemas de codificación Unicode. 
  5. "El estándar Unicode 5.0, capítulo 2: Estructura general" (PDF) . pág. 36. Consultado el 30 de noviembre de 2008. El uso de una BOM no es obligatorio ni recomendable para UTF-8, pero puede encontrarse en contextos donde los datos UTF-8 se convierten desde otras formas de codificación que utilizan una BOM o donde la BOM se utiliza como firma UTF-8. 
  6. 1 2 "Preguntas frecuentes - UTF-8, UTF-16, UTF-32 y BOM: ¿Puede una secuencia de datos UTF-8 contener el carácter BOM (en formato UTF-8)? Si es así, ¿puedo asumir que los bytes UTF-8 restantes están en orden big-endian?" . Unicode.org . Consultado el 4 de enero de 2009 .
  7. "Re: pre-HTML5 y el BOM de Asmus Freytag el 13-07-2012 (Archivo de la lista de correo de Unicode)" . Unicode.org . Consultado el 14 de julio de 2012 .
  8. "ID de error: JDK-6378911 El manejo de la marca de orden de bytes por parte del decodificador UTF-8 ha cambiado" . Bugs.java.com . Consultado el 14 de octubre de 2021 .
  9. Yergeau, Francois (noviembre de 2003). UTF-8, un formato de transformación de ISO 10646. IETF . doi : 10.17487 /RFC3629 . RFC 3629. Consultado el 15 de mayo de 2014 .
  10. Gerhards, Rainer (marzo de 2009). "MSG" . El protocolo Syslog . IETF . sec. 6.4. doi : 10.17487/RFC5424 . RFC 5424 . 
  11. Alf P. Steinbach (2011). "Unicode parte 1: Enfoques de E/S de consola de Windows" . Recuperado el 24 de marzo de 2012. Sin embargo, dado que el código fuente de C++ estaba codificado como UTF-8 sin BOM (como es habitual en Linux), el compilador de Visual C++ asumió erróneamente que el código fuente estaba codificado como Windows ANSI.
  12. "El Bloc de notas de Windows 10 mejora su compatibilidad con la codificación UTF-8" . BleepingComputer . Consultado el 7 de marzo de 2023 .
  13. "UTF-16LE" . Estándar de codificación . WHATWG.
  14. "Decodificar" . Estándar de codificación . WHATWG.
  15. Yergeau, François (8 de noviembre de 2003). "RFC 3629 - UTF-8, un formato de transformación de ISO 10646" . Ietf Datatracker . Consultado el 28 de enero de 2017 .
  16. Honermann, Tom (2 de enero de 2021). "Aclarar las directrices para el uso de una BOM como firma de codificación UTF-8" (PDF) . Unicode .
  17. "Documentación de SDL" .
  18. Markus Scherer. "UTS #6: Esquema de compresión para Unicode" . Unicode.org . Consultado el 28 de enero de 2017 .
  • Preguntas frecuentes sobre Unicode: UTF-8, UTF-16, UTF-32 y BOM
  • El estándar Unicode, capítulo 2.6 Esquemas de codificación
  • El estándar Unicode, capítulo 2.13 Caracteres especiales y no caracteres , sección Marca de orden de bytes (BOM)
  • El estándar Unicode, capítulo 16.8 , Características especiales , sección Marca de orden de bytes (BOM): U+FEFF
  • La marca de orden de bytes (BOM) en HTML