Рубрики
Без рубрики

SAX – Недопустимый байт 1 из 1-байтовой последовательности UTF-8

другая кодировка символов вызовет эту ошибку “Недопустимый байт 1 из 1-байтовой последовательности UTF-8”.

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