Объяснение ошибки JAXB: Недопустимый байт 1 из 1-байтовой последовательности UTF-8

Мы анализируем XML-документ с помощью JAXB и получаем эту ошибку:

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

Что точно это означает и как мы можем разрешить это??

Мы выполняем код как:

jaxbContext = JAXBContext.newInstance(Results.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(getSchema());
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile));

Обновление

Проблема, кажется, происходит из-за этого "забавного" символа в XML-файле: ¿

Почему это вызвало бы такую проблему??

Обновление 2

Существует два из тех странных символов в файле. Они около середины файла. Обратите внимание, что файл создается на основе данных в базе данных, и те странные символы так или иначе вошли в базу данных.

Обновление 3

Вот полный отрывок XML:

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description>

Обновление 4

Обратите внимание, что существует нет <?xml ...?> заголовок.

ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО для специального символа является BF

5
задан Marcus Leon 14 June 2010 в 19:51
поделиться

3 ответа

Итак, ваша проблема в том, что JAXB обрабатывает файлы XML без заголовка как UTF-8, когда ваш файл использует другую кодировку (возможно, ISO-8859-1 или Windows-1252, если символ 0xBF на самом деле предназначен для обозначения ¿).

Если вы можете изменить производителя файла, вы можете добавить заголовок с фактической спецификацией кодировки или просто использовать UTF-8 для записи файла.

Если вы не можете изменить производителя, вы должны использовать InputStreamReader с явной спецификацией кодировки, потому что (к сожалению) JAXB не позволяет изменить кодировку по умолчанию:

results = (Results) unmarshaller.unmarshal(
   new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

Однако это решение является хрупким - он не работает с входными файлами с заголовком с другой спецификацией кодировки.

3
ответ дан 15 December 2019 в 00:50
поделиться

Вероятно, это Метка порядка байтов (BOM) и представляет собой особую последовательность байтов в начале файла UTF. Откровенно говоря, это заноза в заднице, и они кажутся особенно распространенными при взаимодействии с системами .net.

Попробуйте перефразировать свой код, чтобы использовать Reader , а не InputStream :

results = (Results) unmarshaller.unmarshal(new FileReader(inputFile));

Reader поддерживает UTF и может помочь лучше на него. Проще говоря, передайте файл непосредственно в Unmarshaller , и пусть JAXBContext позаботится об этом:

results = (Results) unmarshaller.unmarshal(inputFile);
1
ответ дан 15 December 2019 в 00:50
поделиться

Похоже, ваш XML закодирован с помощью UTF-16, но эта кодировка не передается Unmarshaller. С помощью Marshaller вы можете установить это, используя marshaller.setProperty (Marshaller.JAXB_ENCODING, «UTF-16»); , но поскольку Unmarshaller не требуется для поддержки каких-либо свойств, я не уверен, как обеспечить соблюдение этого другого чем убедиться, что ваш XML-документ содержит encoding = "UTF-16" в начальном элементе .

0
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: