¿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
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.
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 A
), por lo que no es necesariamente un requisito para evitar la pérdida de datos.
* »XML permite representación de cualquier carácter Unicode a través de entidades de escape «* - bueno, excepto que necesita secciones CDATA ;-) – Joey
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.
Ahh. Consejo interesante. Nunca pensé en eso. Afortunadamente, la fusión de archivos XML no es tan común. – djangofan
¿Y qué hay de listas de materiales en un archivo UTF-16LE? –
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.
No estoy seguro de cómo podría ser útil responder a la pregunta "¿Qué es XML BOM y cómo lo detecto?" – Matt
@Matt - Copié la descripción de los Javadocs. Espero que ayude. –
- 1. ¿Qué es DOM y BOM en JavaScript?
- 2. ¿Qué es ct100 y cómo lo cambio?
- 3. ¿Qué es makeinfo y cómo lo obtengo?
- 4. Cómo quitar la BOM de un archivo XML en Java
- 5. Cómo elimino el carácter BOM de mi archivo xml
- 6. Cómo detecto bots programáticamente
- 7. ¿Cómo detecto un toque en un UIBezierPath y muevo una pelota a lo largo de eso?
- 8. XDocument: guardando XML en un archivo sin BOM
- 9. MSBuild: ¿Qué es y cuándo lo necesito?
- 10. ¿Qué es SAPI y cuándo lo usarías?
- 11. Java: si tengo una instancia de mi programa ejecutándose, cómo lo detecto, y luego cierro el (los) anterior (es)
- 12. ¿Qué es Redis pubsub y cómo lo uso?
- 13. ¿Qué es la cobertura del código y cómo lo mides?
- 14. ¿Qué es un yeso no revisado y cómo lo verifico?
- 15. ¿Qué es el paster y cómo lo instalo?
- 16. ObjectSpace: ¿qué es y cómo lo usa la gente?
- 17. Marshalling: ¿qué es y por qué lo necesitamos?
- 18. ¿Qué es un infoset XML y de qué forma es diferente a un documento XML?
- 19. ¿Qué es el/elemento? ¿Como lo uso? ¿Y por qué?
- 20. ¿Qué es Repo y por qué lo usa Google?
- 21. lo que es Contexto Android y por qué es necesario
- 22. ¿Cómo detecto un navegador móvil y le envío contenido apropiado?
- 23. ¿Ir o no ir con Liferay? ¿Qué es lo bueno, lo malo y lo feo?
- 24. ¿Qué significa esto y cómo lo ayuda?
- 25. ¿Qué es un Manifiesto en Scala y cuándo lo necesitas?
- 26. Cómo detecto la entrada táctil en Android
- 27. Lo que es mejor: Json o XML (PHP)
- 28. ¿Qué es lo opuesto a "es"?
- 29. Cómo detecto las dimensiones del anuncio servido
- 30. ¿Qué es exactamente streambuf? ¿Como lo uso?
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
@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
que explica por qué Notepad ++ le permite establecer el valor predeterminado para que los archivos nuevos sean "UTF-8 sin BOM" – djangofan