java xml encoding sax xml-parsing

java - ¿Cómo se deja que el analizador SAX determine la codificación de la declaración xml?



encoding xml-parsing (2)

Estoy tratando de analizar archivos xml de diferentes fuentes (sobre las cuales tengo poco control). La mayoría de ellos están codificados en UTF-8 y no causan ningún problema con el siguiente fragmento de código:

SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FeedHandler handler = new FeedHandler(); InputSource is = new InputSource(getInputStream()); parser.parse(is, handler);

Dado que SAX se establece de manera predeterminada en UTF-8, está bien. Sin embargo, algunos de los documentos declaran:

<?xml version="1.0" encoding="ISO-8859-1"?>

Aunque se declara ISO-8859-1, SAX sigue siendo de forma predeterminada UTF-8. Solo si agrego:

is.setEncoding("ISO-8859-1");

Will SAX usará la codificación correcta.

¿Cómo puedo permitir que SAX detecte automáticamente la codificación correcta de la declaración xml sin que yo la configure específicamente? Necesito esto porque no sé de antemano cuál será la codificación del archivo.

Gracias de antemano, Allan


Encontré la respuesta yo mismo.

El analizador SAX utiliza InputSource internamente y de los documentos de InputSource:

El analizador SAX utilizará el objeto InputSource para determinar cómo leer la entrada XML. Si hay una secuencia de caracteres disponible, el analizador leerá esa secuencia directamente, sin tener en cuenta ninguna declaración de codificación de texto encontrada en esa secuencia. Si no hay una secuencia de caracteres, pero hay una secuencia de bytes, el analizador utilizará esa secuencia de bytes, utilizando la codificación especificada en InputSource o de lo contrario (si no se especifica codificación) autodetectando la codificación de caracteres utilizando un algoritmo como el de la especificación XML. Si no está disponible ni un flujo de caracteres ni un flujo de bytes, el analizador intentará abrir una conexión URI al recurso identificado por el identificador del sistema.

Entonces, básicamente, debe pasar una secuencia de caracteres al analizador para que recoja la codificación correcta. Vea la solución a continuación:

SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FeedHandler handler = new FeedHandler(); Reader isr = new InputStreamReader(getInputStream()); InputSource is = new InputSource(); is.setCharacterStream(isr); parser.parse(is, handler);


Utilice InputStream como argumento para InputSource cuando desee que Sax detecte automáticamente la codificación.

Si desea establecer una codificación específica, use Reader con una codificación específica o método setEncoding .

¿Por qué? Debido a que los algoritmos de codificación de autodetección requieren datos sin formato, no se convierten a caracteres.

La pregunta en el tema es: ¿Cómo dejar que el analizador SAX determine la codificación de la declaración xml? Me pareció que la respuesta de Allan a la pregunta era engañosa y proporcioné la alternativa, basada en el comentario de Jörn Horstmann y en mi experiencia posterior.