Восстановление неправильной кодировки в файлах XML - PullRequest
4 голосов
/ 19 октября 2008

Один из наших провайдеров иногда отправляет потоки XML, которые помечены как документы в кодировке UTF-8, но содержат символы, которые не включены в кодировку UTF-8. Это заставляет синтаксический анализатор генерировать исключение и останавливать построение объекта DOM, когда встречаются эти символы:

DocumentBuilder.parse(ByteArrayInputStream bais) 

выдает следующее исключение:

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

Есть ли способ «перехватить» эти проблемы на раннем этапе и избежать исключения (то есть найти и удалить эти символы из потока)? То, что я ищу, - это вариант «наилучшего усилия» для ошибочно закодированных документов. Правильное решение, очевидно, состояло бы в том, чтобы атаковать проблему в источнике и убедиться, что доставляются только правильные документы, но каков хороший подход, когда это невозможно?

Ответы [ 3 ]

4 голосов
/ 20 октября 2008

если проблема действительно в неправильной кодировке (в отличие от смешанной кодировки), вам не нужно перекодировать документ для его анализа. просто проанализируйте его как Reader вместо InputStream, и анализатор dom проигнорирует заголовок:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));
2 голосов
/ 20 октября 2008

Вы должны вручную взглянуть на недействительные документы и посмотреть, что является общей проблемой для них. Вполне вероятно, что они на самом деле находятся в другой кодировке (наиболее вероятно, windows-1252), и тогда лучшим решением было бы взять каждый документ из сломанной системы и перекодировать его в UTF-8 перед анализом.

Другая возможная причина - смешанные кодировки (содержимое некоторых элементов находится в одной кодировке, а содержимое других элементов - в другой кодировке). Это будет сложнее исправить.

Вам также понадобится способ узнать, когда сломанная система будет исправлена, чтобы вы могли прекратить использовать обходной путь.

0 голосов
/ 20 октября 2008

Вы должны сказать им, чтобы отправить вам правильный UTF-8. В противном случае любое решение должно перекодировать плохие символы как действительный UTF-8, а затем передать его анализатору. Причина этого заключается в том, что если плохие символы сохраняются, то разные программы могут интерпретировать любой вывод разными способами, что может привести к дырам в безопасности.

...