Примечание Начиная с 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/”