Восстановление неправильной кодировки в файлах XML
Один из наших провайдеров иногда отправляет потоки XML, которые помечены как документы в кодировке UTF-8, но содержат символы, которые не включены в кодировку UTF-8. Это заставляет синтаксический анализатор генерировать исключение и останавливать построение объекта DOM, когда встречаются эти символы:
DocumentBuilder.parse(ByteArrayInputStream bais)
выдает следующее исключение:
org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.
Есть ли способ "перехватить" эти проблемы на раннем этапе и избежать исключения (т.е. найти и удалить эти символы из потока)? То, что я ищу, - это резервный вариант "наилучшего усилия" для неправильно закодированных документов. Правильное решение, очевидно, состояло бы в том, чтобы атаковать проблему в источнике и убедиться, что поставляются только правильные документы, но каков хороший подход, когда это невозможно?
3 ответа
Если проблема действительно в неправильной кодировке (в отличие от смешанной кодировки), вам не нужно перекодировать документ для его анализа. просто проанализируйте его как Reader вместо InputStream, и анализатор dom проигнорирует заголовок:
DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));
Вы должны вручную взглянуть на недействительные документы и посмотреть, что является общей проблемой для них. Вполне вероятно, что они на самом деле находятся в другой кодировке (наиболее вероятно, windows-1252), и тогда лучшим решением было бы взять каждый документ из сломанной системы и перекодировать его в UTF-8 перед анализом.
Другая возможная причина - смешанные кодировки (содержимое некоторых элементов находится в одной кодировке, а содержимое других элементов - в другой кодировке). Это будет сложнее исправить.
Вам также потребуется способ узнать, когда сломанная система будет исправлена, чтобы вы могли прекратить использовать обходной путь.
Вы должны сказать им, чтобы отправить вам правильный UTF-8. В противном случае любое решение должно перекодировать плохие символы как действительный UTF-8, а затем передать его анализатору. Причина этого заключается в том, что если плохие символы сохраняются, то разные программы могут интерпретировать любой вывод разными способами, что может привести к дырам в безопасности.