Практическое руководство позволило синтаксическому анализатору SAX определить кодирование из определения XML?

Я пытаюсь проанализировать XML-файлы из других источников (над которым я имею мало контроля). Большинство их кодируется в UTF-8 и не вызывает проблем с помощью следующего отрывка:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
FeedHandler handler = new FeedHandler();
InputSource is = new InputSource(getInputStream());
parser.parse(is, handler);

Начиная со значений по умолчанию SAX к UTF-8 это прекрасно. Однако некоторые документы объявляют:

<?xml version="1.0" encoding="ISO-8859-1"?>

Даже при том, что ISO-8859-1 объявляется SAX все еще значениями по умолчанию к UTF-8. Только если я добавляю:

is.setEncoding("ISO-8859-1");

Будет использование SAX корректное кодирование.

Как я могу позволить SAX автоматически обнаружить корректное кодирование из определения XML без меня конкретно установка его? Мне нужно это, потому что я не знаю перед рукой, каково кодирование файла будет.

Заранее спасибо, Allan

25
задан Allan 14 August 2010 в 08:04
поделиться

1 ответ

Я сам нашел ответ.

Парсер SAX использует InputSource внутри, и из документации по InputSource:

Парсер SAX будет использовать объект InputSource для определения того, как читать входные данные XML. Если имеется поток символов доступен, парсер будет читать этот поток напрямую, не обращая внимания на любую текстовую кодировку обнаруженную в этом потоке. Если символьный поток отсутствует, но но есть поток байтов, синтаксический анализатор будет использовать этот поток байтов, используя кодировку, указанную в InputSource или иначе (если кодировка не указана) автоопределение кодировки символов используя алгоритм, подобный тому, который приведен в спецификации XML. Если ни ни поток символов, ни поток байтов доступны, синтаксический анализатор попытается открыть URI-соединение с ресурсом идентифицированному системным идентификатором".

Таким образом, в основном вам нужно передать символьный поток парсеру, чтобы он выбрал правильную кодировку. Смотрите решение ниже:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
FeedHandler handler = new FeedHandler();
Reader isr = new InputStreamReader(getInputStream());
InputSource is = new InputSource();
is.setCharacterStream(isr);
parser.parse(is, handler);
9
ответ дан 28 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: