2009-10-19 5 views
3

SAX продолжает умирать на следующее исключение:Сообщите SAX Parser игнорировать недопустимые символы?

Invalid byte 2 of 3-byte UTF-8 sequence 

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

Как мы можем сказать SAX игнорировать недопустимые последовательности символов или очистить файл UTF-8, чтобы он не имел недопустимых последовательностей UTF-8?

ответ

2

Я бы предположил, что вы очистили файл как полностью отдельный шаг от разбора XML.

UTF-8 - довольно простая кодировка для понимания; this web page показывает, как формируется UTF-8. Я предлагаю вам написать программу, которая читает ваш входной файл и выписывает новый файл. Он будет читать байты байтом, только выписывая символ, когда видит, что он был правильно сформирован. Когда он видит недопустимый байт, он выписывает строку «UTF8ERROR» или какой-либо другой легко обнаруживаемый токен, который не будет происходить естественным образом во входных данных. Затем он пропустит остальную часть персонажа.

После этого вы можете проверить, где произошли ошибки, и исправить данные ... затем проанализировать его как обычно.

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

+0

Итак, в основном, вы подтверждаете, что я надеялся не делать. Мы должны написать собственные дезинфицирующие средства UTF-8. – corydoras

+0

Я боюсь, что в сети могут быть похожие вещи, но я не знать о любом. –

+0

Поиск других людей с вашей точной проблемой предполагает, что у вас может быть неправильная кодировка. Если это так, это может быть быстрым решением. /sesame/users/ch09.html#d0e3707 – Gunslinger47

3

Вы можете фильтровать поток до того, как SAX его прочитает. Создайте InputStream, который считывает ваш поток и удаляет недопустимые символы.

+0

Я предполагаю, что это должно быть сказано для некоторых людей, но это своего рода констатировал очевидное. (: – corydoras

1

SAX (и другие инструменты XML) предназначены для работы с хорошо сформированным (или когда требуется) XML. Они преднамеренно бросают ошибки или исключения, когда ввод не является корректным, в том числе несоблюдение кодировки. Поэтому, как и другие ответы, вы должны использовать отдельный шаг для очистки ввода.

(Аналогично SAX будет вызывать ошибки с HTML, который не является хорошо сформированным XML, например, отсутствующие конечные теги).

0

Я предполагаю, что это не поможет вам много, но, возможно, другие хотели бы знать:

Недавно я получил такое же исключение при извлечении XML-файл в кодировке UTF-8, который служил с ISO-8859-1 заголовкам , Решение было указать UTF-8 вручную через String.getBytes (набор символов):

public Document parseRequest(HttpServletRequest request) { 
    DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance(); 

    DataInputStream dataStream = new DataInputStream(request.getInputStream()); 
    String xml = dataStream.readUTF(); 
    ByteArrayInputStream byteStream = new ByteArrayInputStream(xml.getBytes("UTF-8")); 
    return builder.newDocumentBuilder().parse(byteStream); 
} 

EDIT: .. или еще проще:

public Document parseRequest(HttpServletRequest request) { 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 

    Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8"); 
    InputSource source = new InputSource(reader); 
    return domFactory.newDocumentBuilder().parse(source); 
} 
+0

Действительно полезная информация для некоторых людей, но вы правы , это не устраняет проблему смешанного кодирования, хранящуюся в одном файле. – corydoras

0

Не могли бы вы использовать java.nio.charset. CharsetDecoder вместе с InputStreamReader (InputStream in, CharsetDecoder dec) каким-то образом?

Как ошибка декодирования обрабатывается зависит от действия запрашиваемого для , что тип ошибки, которая описана экземпляром класса CodingErrorAction.Возможные действия об ошибках игнорировать ошибочный ввод, сообщить об ошибке заклинателя через возвращенный объект CoderResult или замените ошибочный ввод с текущим значением строки замены. Замена имеет начальное значение "\ uFFFD"; его значение может быть изменено с помощью метода replaceWith через .

(от CharsetDecoder Javadoc)

+0

Интересная идея, я не уверен. – corydoras

Смежные вопросы