Pergunta

Um dos nossos fornecedores são por vezes enviando alimentações XML que são marcadas como documentos codificados em UTF-8, mas inclui caracteres que não estão incluídos no UTF-8 charset. Isso faz com que o analisador para lançar uma exceção e parar de construir o objeto DOM quando esses caracteres são encontrados:

DocumentBuilder.parse(ByteArrayInputStream bais) 

lança a seguinte exceção:

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

Existe uma maneira de "capturar" estes problemas precoces e evitar a exceção (ou seja, encontrar e remover esses caracteres do fluxo)? O que eu estou procurando é um tipo de "melhor esforço" de fallback para documentos erroneamente codificados. A solução correta seria, obviamente, para atacar o problema na fonte e certifique-se de que apenas os documentos corretos são entregues, mas o que é uma abordagem bem quando isso não é possível?

Foi útil?

Solução

Se o problema realmente é a codificação errada (em oposição a uma codificação mista), você não precisa re-codificar o documento para analisá-lo. apenas analisá-lo como um leitor em vez de um InputStream eo analisador dom irá ignorar o cabeçalho:

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

Outras dicas

Você deve tomar manualmente uma olhada nos documentos inválidos e ver o que é o problema comum a eles. É bastante provável que eles são, de fato, em outra codificação (provavelmente windows-1252), e a melhor solução então seria a de tomar todos os documentos do sistema quebrado e recodificar-lo para UTF-8 antes da análise.

Outra causa possível é codificações mistos (o conteúdo de alguns elementos é em uma codificação e o conteúdo de outros elementos é em outra codificação). Isso seria mais difícil de correção.

Você também precisa encontrar uma maneira de saber quando o sistema quebrado fica fixo para que você pode parar de usar a sua solução.

Você deve dizer-lhes para lhe enviar UTF-8 correto. Falhando que qualquer solução deve reencode os personagens maus como UTF-8 válidos, em seguida, passá-lo para o analisador. A razão para isso é que, se os personagens maus são preservados, em seguida, diferentes programas podem interpretar todas as maneiras diferentes de saída, que pode levar a falhas de segurança.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top