У меня есть 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?