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

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

DocumentBuilder.parse(ByteArrayInputStream bais) 

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

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

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


person Burre    schedule 19.10.2008    source источник


Ответы (3)


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

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>")));
person james    schedule 19.10.2008
comment
Спасибо за совет. Это избежало исключения, к сожалению, это мне не очень помогло, потому что кажется, что незаконные символы находятся внутри строк идентификаторов, которые я извлекаю (и нуждаюсь), и теперь они получают неправильную кодировку. Думаю, мне просто нужно подождать, пока контент-провайдеры исправят свою ошибку. - person Burre; 20.10.2008

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

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

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

person CesarB    schedule 19.10.2008
comment
Я подозреваю, что это случай смешанных кодировок (или просто нескольких мошеннических символов), потому что другие данные из того же источника работают нормально. Он содержит названия мест в Швеции, поэтому я подозреваю, что некоторые символы в них плохо закодированы. - person Burre; 20.10.2008

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

person Watson Ladd    schedule 20.10.2008