Pregunta

¿Son estos obsoletos? Parecen la peor idea de la historia: incrustar algo en el contenido de su archivo que nadie puede ver, pero que afecta la funcionalidad del archivo. No entiendo por qué querría uno.

¿Fue útil?

Solución

Son necesarios en algunos casos, sí, porque hay implementaciones de UTF-16 tanto endian como big endian.

Al leer un archivo UTF-16 desconocido, ¿cómo puede saber cuál de los dos se usa? La única solución es colocar algún tipo de marcador fácilmente identificable en el archivo, que nunca se pueda confundir con otra cosa, independientemente de la endianidad utilizada.

Eso es lo que hace la lista de materiales.

¿Y necesitas uno? Solo si está 1) usando una codificación UTF donde la endianness es un problema (es importante para UTF-16, pero UTF8 siempre se ve igual independientemente de la endianness), y el archivo se va a compartir con aplicaciones externas.

Si su propia aplicación es la única que va a leer y escribir el archivo, puede omitir la lista de materiales y simplemente decidir de una vez por todas qué endianness va a utilizar. Pero si otra aplicación tiene que leer el archivo, no sabrá de antemano el endianness, por lo que agregar la lista de materiales puede ser una buena idea.

Otros consejos

Algunos extractos del Preguntas frecuentes sobre UTF y BOM del Consorcio Unicode pueden ser útiles.

  

P: ¿Qué es una BOM?

     

A: Una marca de orden de bytes (BOM) consiste en el código de caracteres U + FEFF al comienzo de un flujo de datos , donde se puede usar como firma definiendo el orden de bytes y la forma de codificación, principalmente de archivos de texto plano sin marcar. Bajo algunos protocolos de nivel superior, el uso de una lista de materiales puede ser obligatorio (o prohibido) en el flujo de datos Unicode definido en ese protocolo. (El énfasis es mío)

No diría exactamente que la marca de orden de bytes está incrustada en los datos. Más bien, prefijos los datos. El carácter es solo una marca de orden de bytes cuando es lo primero en el flujo de datos. En cualquier otro lugar, y es el espacio sin interrupción de ancho cero . Los programas con reconocimiento Unicode que no respetan la marca de orden de bytes no se ven realmente perjudicados por su presencia de todos modos ya que el carácter es invisible, y una combinación de palabras al comienzo de un bloque de texto simplemente une el siguiente carácter a nada, por lo que no tiene efecto.

  

P: ¿Dónde es útil una BOM?

     

A: Una lista de materiales es útil al comienzo de los archivos que se escriben como texto, pero para los que no se sabe si están en formato endian grande o pequeño & # 8212; también puede servir como una pista que indica que el archivo está en Unicode, en lugar de en una codificación heredada y, además, actúa como una firma para el formulario de codificación específico utilizado.

Entonces, querrás una lista de materiales cuando tu programa sea capaz de manejar múltiples codificaciones de Unicode. ¿De qué otra forma sabrá su programa qué codificación usar al interpretar su entrada?

  

P: Cuando se usa una lista de materiales, ¿está solo en texto Unicode de 16 bits?

     

A: No, una lista de materiales se puede utilizar como firma sin importar cómo se transforma el texto Unicode: UTF-16, UTF-8, UTF-7, etc. Los bytes exactos que comprenden BOM será lo que sea que el formato Unicode U + FEFF se convierta en ese formato de transformación. De esa forma, la lista de materiales sirve para indicar que es un archivo Unicode y en qué formatos está.

Ese es probablemente el caso donde la lista de materiales se usa con mayor frecuencia en la actualidad. Distingue el texto codificado en UTF-8 de cualquier otra codificación; en realidad no está marcando el orden de los bytes ya que UTF-8 solo tiene un orden.

Si está diseñando su propio protocolo o formato de datos, no es necesario que use una lista de materiales. Otra pregunta de las preguntas frecuentes toca eso:

  

P: ¿Cómo etiqueto los datos que no interpretan U + FEFF como BOM?

     

A: Use la etiqueta UTF-16BE para indicar texto UTF-16 big-endian, y UTF-16LE para indicar texto UTF-16 little-endian. Si usa una lista de materiales, etiquete el texto como simplemente UTF-16.

Menciona el concepto de etiquetado del formato de sus datos. Eso significa especificar el formato fuera de banda de los datos en sí. Eso es genial si dicha instalación está disponible para usted, pero a menudo no lo está, especialmente cuando los sistemas más antiguos se están adaptando para Unicode.

La lista de materiales indica en qué codificación de Unicode se encuentra el archivo. Sin esta distinción, un lector Unicode no sabría cómo leer el archivo.

Sin embargo, UTF-8 no requiere una lista de materiales.

Consulte el artículo de Wikipedia .

Al etiquetar esto con UTF-8, voy a decir que no necesita una lista de materiales. Las marcas de orden Byto solo son útiles para UTF-16 y UTF-32, ya que informa a la computadora si el archivo está en Big Endian o Little Endian . Algunos editores de texto pueden usar la marca de orden de bytes para decidir qué codificación usa el documento, pero esto no es parte del estándar Unicode.

El " BOM " es un remanente de los primeros días de Unicode cuando se suponía que usar Unicode significaría usar caracteres de 16 bits. Es completamente inútil en una codificación como UTF-8 que solo tiene un orden de bytes. La elección de U + FEFF también es subóptima para UTF-32, ya que no puede distinguir entre todas las posibles órdenes de bytes de endian medio (para hacerlo se requeriría una lista de materiales codificada con 4 bytes diferentes ).

La única razón por la que usaría uno es al enviar datos UTF-16 o UTF-32 entre plataformas con diferentes órdenes de bytes, pero (1) la mayoría de las personas usan UTF-8 de todos modos, y (2) el MIME charset El parámetro proporciona un mejor mecanismo.

UTF16 y UTF32 se pueden escribir en forma Big-Endian y Little-Endian. Puede intentar determinar heurísticamente la endianess analizando el resultado del tratamiento del archivo en cualquiera de las dos, pero para ahorrarle toda esa molestia, la lista de materiales puede informarle de inmediato.

UTF-8 realmente no necesita una lista de materiales, ya que la decodifica byte a byte.

Independientemente de si los usa usted mismo al crear archivos de texto, probablemente valga la pena tenerlo en cuenta cuando lea los archivos de texto. es decir, detectar y omitir (e idealmente manejar en consecuencia) la lista de materiales al comienzo del archivo. Me he encontrado con algunos que lo tenían y que me causaron algunos problemas inicialmente hasta que descubrí lo que estaba pasando.

Como las listas de materiales UTF16 y UTF32 indican si el contenido está en formato Big-Endian o Little-Endian y también que el contenido es Unicode, la lista de materiales UTF-8 clasifica el archivo como codificado utf-8. Sin la BOM UTF-8, ¿cómo puede saber si es un archivo ANSI o un archivo codificado UTF-8? La lista de materiales UTF-8 no indica la resistencia, por supuesto, porque utf-8 siempre es un flujo de bytes, pero si el contenido está codificado en utf-8 Unicode o ANSI. Por supuesto, puede buscar secuencias utf-8 válidas, pero en mi opinión, es más fácil verificar los primeros tres bytes del archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top