saxparser игнорирует метку порядка байтов - PullRequest
1 голос
/ 16 апреля 2010

Наш saxparser не игнорирует метку порядка байтов , которая появляется в начале файла.

Как заставить мой синтаксический анализатор игнорировать метку порядка байтов?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Проверьте файл в шестнадцатеричном редакторе.

Если за начальными байтами действительно стоит \xEF\xBB\xBF, за которым следует сам документ, то это искусственная спецификация UTF-8. Хотя поддельные спецификации UTF-8 являются грубым заблуждением и инструменты, которые их генерируют, должны быть уничтожены специальной кислотой программирования, спецификация XML требует синтаксических анализаторов для распознавания и игнорирования этой последовательности байтов, так что если ваш SAX-анализатор SAX Разве это не соответствует требованиям и нуждается в ударе ногой.

Если начальные байты, которые дают вам , на самом деле похожи на один из:

\xC3\xAF\xC2\xBB\xC2\xBF 
\xEF\xBB\xBF\xC3\xAF\xC2\xBB\xC2\xBF 
\xEF\x00\xBB\x00\xBF\x00
\xFF\xFE\xEF\x00\xBB\x00\xBF\x00

тогда то, что у вас есть, это случайное двойное кодирование. В этом случае вам нужно взглянуть на программу, производящую файл, потому что он не правильно сформирован, парсер SAX будет правильным, чтобы жаловаться, и другие символы Unicode в файле, вероятно, тоже будут испорчены. Возможно, он делает что-то глупое, например, сериализацию документа в байтовую строку, а затем отправку его через фиктивный цикл декодирования / кодирования.

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

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

1 голос
/ 16 апреля 2010

Похоже, что вы можете выдавать ввод utf-16 саксофонисту, который не ожидает utf-16. Попробуйте преобразовать данные в utf-8, это может помочь.

...