reglas programacion practicas para objetos normas nomenclatura nombres nombre metodos lenguaje estandares documentacion convención convenciones codificación codificacion buenas java xml encoding utf-8

programacion - Producir XML válido con codificación Java y UTF-8



normas de codificación java (2)

Use un FileOutputStream en lugar de un FileWriter.

Este último aplica su propia codificación, que casi con seguridad no es UTF-8 (dependiendo de su plataforma, probablemente sea Windows-1252 o IS-8859-1).

Editar (ahora que tengo algo de tiempo):

Se permite codificar un documento XML sin prólogo como UTF-8 o UTF-16. Con un prólogo, se permite especificar su codificación (el prólogo puede contener solo caracteres US-ASCII, por lo que el prólogo siempre es legible).

Un lector trata con personajes; Decodificará la secuencia de bytes del InputStream subyacente. Como resultado, cuando pasa un lector al analizador, le dice que ya ha manejado la codificación, por lo que el analizador ignorará el prólogo. Cuando pasa un InputStream (que lee bytes), no hace esta suposición, y buscará en el prólogo para definir la codificación, o por defecto a UTF-8 / UTF-16 si no está allí.

Nunca intenté leer un archivo codificado en UTF-16. Sospecho que el analizador buscará una Marca de Orden de Byte (BOM) como los primeros 2 bytes del archivo.

Estoy usando JAXP para generar y analizar un documento XML desde el cual se cargan algunos campos desde una base de datos.

Código para serializar el XML:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.newDocument(); Element root = doc.createElement("test"); root.setAttribute("version", text); doc.appendChild(root); DOMSource domSource = new DOMSource(doc); TransformerFactory tFactory = TransformerFactory.newInstance(); FileWriter out = new FileWriter("test.xml"); Transformer transformer = tFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.transform(domSource, new StreamResult(out));

Código para analizar el XML:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("test.xml");

Y encuentro la siguiente excepción:

[Fatal Error] test.xml:1:4: Invalid byte 1 of 1-byte UTF-8 sequence. Exception in thread "main" org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence. at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) at com.test.Test.xml(Test.java:27) at com.test.Test.main(Test.java:55)

El texto de cadena incluye u-umlaut y o-umlaut (códigos de caracteres 0xFC y 0xF6). Estos son los personajes que están causando el error. Cuando escapo de String para usar & # xFC; y & # xF6; entonces el problema desaparece Otras entidades se codifican automáticamente cuando escribo el XML.

¿Cómo consigo que mi salida se escriba / lea correctamente sin sustituir estos caracteres yo mismo?

(Ya leí las siguientes preguntas:

¿Cómo codificar caracteres de Oracle a XML?

Reparación de codificación incorrecta en archivos XML )


Bueno, con seguridad 0xFC y 0xF6 no son caracteres UTF-8 válidos. Estos deberían haber finalizado en las dos secuencias de bytes: 0x3CBC y 0x3CB6 .

Lo más probable es que el problema esté con la fuente original de los caracteres que se define como UTF-8 cuando no lo son.