Восстановление неправильной кодировки в файлах XML

StackOverflow https://stackoverflow.com/questions/216890

Вопрос

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

DocumentBuilder.parse(ByteArrayInputStream bais) 

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top