java + xml: библиотеки обрабатывают кодировку из заголовка <? xml?>? - PullRequest
3 голосов
/ 21 февраля 2012

Я настолько привык к использованию <?xml version="1.0" encoding="UTF-8"?>, что до сих пор этого не происходило, что могут быть некоторые тонкости с другими кодировками, использующими стандартные библиотеки Java XML (SAX, DOM, STaX) ...

Эти библиотеки автоматически обрабатывают атрибут encoding в заголовке при чтении документов XML?Если да, то где это задокументировано?(Это не в DocumentBuilder или DocumentBuilderFactory ) Если нет, что мне нужно сделать, чтобы он работал нормально для разных кодировок?

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

DocumentBuilder использует API SAX для предоставления документа реализации для анализа (хотя реализация может не использовать синтаксический анализатор SAX), а Javadoc для SAX org.xml.sax.InputSource говорит, что он делает с заголовком.

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

Столь интересные случаи могут включать поток XML, предоставляемый через HTTP, с заголовком HTTP Content-Type, который конфликтует с объявлением кодировки XML.

0 голосов
/ 21 февраля 2012

Для JAXB (JSR-222) вы можете использовать флаг Marshaller.JAXB_ENCODING, чтобы указать кодировку:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
marshaller.marshal(address, System.out);

Если вы выполняете сортировку наjava.io.Writer вам нужно будет убедиться, что вы создали писатель с соответствующей кодировкой:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
OutputStreamWriter writer = new OutputStreamWriter(System.out, "ISO-8859-1");
marshaller.marshal(address, writer);

Для получения дополнительной информации о JAXB и кодировке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...