Примечание Начиная с Java 8, встроенный JDK Анализатор Apache Xerces XML был значительно улучшен, и большинство классов ввода-вывода теперь по умолчанию UTF-8 . Мы больше не можем имитировать ту же ошибку, и внутренние API-интерфейсы Xerces теперь печатают ?
для неизвестных символов вместо отображения ошибки Недопустимый байт 1 из 1-байтовой последовательности UTF-8
.
Содержание
- 1. Синтаксический анализатор SAX не может проанализировать XML в формате UTF-8?
- 2. Кодировка символов в XML
- 3. Кодировка символов в исходном коде
- 4. Скачать Исходный Код
- 5. Рекомендации
1. Синтаксический анализатор SAX не может проанализировать XML в формате UTF-8?
В старые времена встроенный синтаксический анализатор XML JDK Apache Xerces выдавал сообщение об ошибке Недопустимый байт 1 из 1-байтовой последовательности UTF-8
если мы попытаемся проанализировать XML-файл, содержащий символы UTF-8.
Например, XML-файл содержит специальный символ и два китайских иероглифа.
yong 木é‡' § 100000
И мы используем синтаксический анализатор SAX для обработки вышеупомянутого XML-файла.
SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); PrintAllHandlerSax handler = new PrintAllHandlerSax(); saxParser.parse("c://test//staff.xml", handler); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); }
Выход
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
2. Кодировка символов в XML
Если в XML-файле отсутствует кодировка, синтаксический анализатор по умолчанию использует UTF-8.
yong 木é‡' § 100000
Рекомендуется определить кодировку символов для XML-файла.
yong 木é‡' § 100000
3. Кодировка символов в исходном коде
Неправильная кодировка символов приведет к Недопустимый байт 1 из 1-байтовой последовательности UTF-8
. Например, мы читаем XML-данные как UTF-8
, но это другая кодировка, например ISO_8859_1
.
Чтобы исправить это, мы можем определить кодировку символов для синтаксического анализатора SAX.
package com.mkyong.xml.sax; import com.mkyong.xml.sax.handler.PrintAllHandlerSax; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.nio.charset.StandardCharsets; public class ReadXmlSaxParser { //private static final String FILENAME = "src/main/resources/staff.xml"; private static final String FILENAME = "c://test//staff.xml"; public static void main(String[] args) { SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); PrintAllHandlerSax handler = new PrintAllHandlerSax(); //saxParser.parse(FILENAME, handler); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(handler); InputSource source = new InputSource(FILENAME); // different encoding source.setEncoding(StandardCharsets.UTF_8.displayName()); xmlReader.parse(source); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
4. Скачать Исходный Код
$клон git $клон git
$компакт-диск java-xml
$cd src/основной/java/com/mkyong/xml-файл/
5. Рекомендации
- Википедия – UTF-8
- Апач ксерксес
- Синтаксический анализатор Java SAX
- Ошибка SAX – Содержимое не допускается в прологе
- Как читать XML-файл на Java (синтаксический анализатор SAX)
- Как прочитать XML-файл UTF–8 на Java – (синтаксический анализатор SAX)
Оригинал: “https://mkyong.com/java/sax-error-malformedbytesequenceexception-invalid-byte-1-of-1-byte-utf-8-sequence/”