Pregunta

Uno de nuestros proveedores a veces envía feeds XML que están etiquetados como documentos codificados en UTF-8 pero incluyen caracteres que no están incluidos en el conjunto de caracteres UTF-8. Esto hace que el analizador genere una excepción y deje de generar el objeto DOM cuando se encuentren estos caracteres:

DocumentBuilder.parse(ByteArrayInputStream bais) 

lanza la siguiente excepción:

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.

¿Hay alguna forma de " captura " estos problemas temprano y evitar la excepción (es decir, encontrar y eliminar esos caracteres de la secuencia) Lo que estoy buscando es un "mejor esfuerzo" Tipo de reserva para documentos codificados erróneamente. La solución correcta obviamente sería atacar el problema en la fuente y asegurarse de que solo se entreguen los documentos correctos, pero ¿cuál es un buen enfoque cuando eso no es posible?

¿Fue útil?

Solución

si el problema realmente es la codificación incorrecta (en lugar de una codificación mixta), no es necesario volver a codificar el documento para analizarlo. simplemente analícelo como un Reader en lugar de un InputStream y el analizador de dominios ignorará el encabezado:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));

Otros consejos

Debe revisar manualmente los documentos no válidos y ver cuál es el problema común para ellos. Es muy probable que, de hecho, estén en otra codificación (probablemente en Windows 1252), y la mejor solución sería tomar todos los documentos del sistema dañado y recodificarlos a UTF-8 antes de analizarlos.

Otra causa posible son las codificaciones mixtas (el contenido de algunos elementos se encuentra en una codificación y el contenido de otros elementos en otra codificación). Eso sería más difícil de arreglar.

También necesitaría una forma de saber cuándo se soluciona el sistema dañado para que pueda dejar de usar su solución.

Debes decirles que te envíen el UTF-8 correcto. Si falla alguna solución, es necesario volver a codificar los caracteres erróneos como UTF-8 válido y luego pasarlos al analizador. La razón de esto es que si los caracteres incorrectos se conservan, los diferentes programas pueden interpretar cualquier salida de diferentes maneras, lo que puede conducir a agujeros de seguridad.

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