Обнаруживает ли SaxParser кодировку xml? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть HTML-файл, который содержит эти теги вверху:

<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="fi" lang="fi" xmlns="http://www.w3.org/1999/xhtml">
<head>

Исключение происходит, когда я пытаюсь использовать SaxParser для анализа файла Html, говоря, что какой-то символ в указанной строке истолбец недействителен, когда я использую этот код:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
InputSource is = new InputSource(new FileInputStream(file));  
parser.parse(is, this);

, если я задаю кодировку с этим: is.setEncoding("ISO-8859-1");, исключение не происходит.

Почему я должен явно указать SaxParser, какую кодировку он должен использовать?не может SaxParser обнаружить кодировку из потока байтов или тега в начале файла html?

Кроме того, документы говорят:

"Если нет потока символов, но естьэто поток байтов, синтаксический анализатор будет использовать этот поток байтов, используя кодировку, указанную в InputSource, или же (если кодировка не указана) автоматически определять кодировку символов с использованием алгоритма, такого как алгоритм в спецификации XML "

Но это не правда!Глядя дальше в коде Java, я вижу это:

 /*
     * TODO: Let Expat try to guess the encoding instead of defaulting.
     * Unfortunately, I don't know how to tell which encoding Expat picked,
     * so I won't know how to encode "<externalEntity>" below. The solution
     * I think is to fix Expat to not require the "<externalEntity>"
     * workaround.
     */
    this.encoding = encoding == null ? DEFAULT_ENCODING : encoding;
    this.pointer = initialize(
        this.encoding,
        processNamespaces
    );

Нет ли алгоритма для обнаружения кодирования XML?

...