2009-11-20 23 views
21

¿Qué es exactamente la lista de materiales en un documento XML ANSI y debería eliminarse? ¿Debería un documento XML estar en UTF-8 en su lugar? ¿Alguien puede decirme un método Java que detectará la lista de materiales? La lista de materiales consta de los personajes EF BB BF.¿Qué es XML BOM y cómo lo detecto?

Respuesta

19

Para un archivo XML ANSI, en realidad debería eliminarse. Si desea usar UTF-8 realmente no lo necesita. Solo para UTF-16 y UTF-32 es necesario.

El orden de bytes-Mark (o BOM), es un marcador especial añadió a la muy comienzo de un archivo Unicode codificada en UTF-8, UTF-16 o UTF-32. Se usa para indicar si el archivo usa el orden big-endian o little-endian . La lista de materiales es obligatoria para UTF-16 y UTF-32, pero es opcional para UTF-8.

En cuanto a la pregunta sobre cómo detectar esto en Java.

Compruebe la siguiente respuesta a esta pregunta: Java: How to determine the correct charset encoding of a stream y si ahora quiere determinar la BOM (bajo su propio riesgo) verifique por ejemplo este código Java Tip: How to read a file and automatically specify the correct encoding.

Básicamente, solo lea los primeros bytes usted mismo y luego determine si puede ha encontrado una lista de materiales.

+0

gracias por la gran respuesta. ya que estoy esperando que el archivo sea UTF-8, ignoro los primeros 3 caracteres usando algo como: String file1sub = getXMLContents (file1) .substring (3); – djangofan

+1

@jitter - No estoy seguro de dónde proviene su cita en listas de materiales. XML no requiere una lista de materiales en documentos UTF-16 o UTF-32; un analizador debe administrarse sin ella. Detección de codificación XML: http://www.w3.org/TR/REC-xml/#sec-guessing De lo contrario, el requisito de una lista de materiales depende del dominio. Preguntas frecuentes sobre BOM de Unicode.org: http://unicode.org/faq/utf_bom.html#BOM – McDowell

+0

que explica por qué Notepad ++ le permite establecer el valor predeterminado para que los archivos nuevos sean "UTF-8 sin BOM" – djangofan

15

La marca de orden de bytes es probable que sea una de estas secuencias de bytes:

 UTF-8 BOM: ef bb bf 
    UTF-16BE BOM: fe ff 
    UTF-16LE BOM: ff fe 
    UTF-32BE BOM: 00 00 fe ff 
    UTF-32LE BOM: ff fe 00 00 

Estas son las formas codificadas diversamente del punto de código Unicode U + FEFF. Esto se puede expresar como un literal de char de Java usando '\uFEFF' (los valores de char de Java son implícitamente UTF-16). Como U + FEFF no está en la mayoría de las codificaciones, no es posible codificar este punto de código BOM. (More on encoding the BOM using Java here.)

Cuando se trata de listas de materiales y XML, son opcionales (consulte también el Unicode BOM FAQ). La detección de codificación en XML es relativamente sencilla si la codificación se especifica en la declaración. Asegúrese siempre de que la declaración XML (<?xml version="1.0" encoding="UTF-8"?>) coincida con la codificación utilizada para escribir el documento. Si es estricto al respecto, los analizadores deberían ser capaces de interpretar sus documentos correctamente. (XML spec on encoding detection.)

Defiendo la codificación como Unicode siempre que sea posible (consulte también 10 Commandments of Unicode). Dicho esto, XML permite la representación de cualquier carácter Unicode a través de entidades de escape (por ejemplo, 'A' podría estar representado por &#x0041;), por lo que no es necesariamente un requisito para evitar la pérdida de datos.

+0

* »XML permite representación de cualquier carácter Unicode a través de entidades de escape «* - bueno, excepto que necesita secciones CDATA ;-) – Joey

4

No inserte una lista de materiales en un archivo utf-8: si se combinan dos archivos de este tipo, termina con una lista de materiales en el medio que podría romper una aplicación o hacer que un analizador xml genere una excepción.

+0

Ahh. Consejo interesante. Nunca pensé en eso. Afortunadamente, la fusión de archivos XML no es tan común. – djangofan

+0

¿Y qué hay de listas de materiales en un archivo UTF-16LE? –

3

OP:

¿Puede alguien decirme un método Java que detectará la lista de materiales?

org.apache.commons.io.input.BOMInputStream Javadocs:

Esta clase detecta estos bytes y, si es necesario, puede saltar automáticamente y devolver el byte subsiguiente como el primer byte en la corriente.

+0

No estoy seguro de cómo podría ser útil responder a la pregunta "¿Qué es XML BOM y cómo lo detecto?" – Matt

+0

@Matt - Copié la descripción de los Javadocs. Espero que ayude. –

Cuestiones relacionadas