ередбачається кодування UTF-8. На XML-парсер покладено обов'язок коректно прочитати заголовок і використовувати відповідну кодування для отримання Unicode-символів. Різні парсери можуть підтримувати різні набори кодувань, але UTF-8 зобов'язані підтримувати все. Тут також, як і у випадку з JavaMail найменування кодувань, описані в стандарті XML можуть розходиться з найменуваннями, прийнятими в Java. Різні парсери по різному виходять з положення. Crimson просто використовує якесь у додаткових синонімів, а в іншому покладається на синоніми кодувань з Java. Xerces ж за замовчуванням використовує внутрішню таблицю (клас org.apache.xerces.readers.MIME2Java), а якщо не знаходить там кодування, то кидає виняток про непідтримуваної кодуванні. У Xerces версії 1.4.0 російських кодувань там всього дві - KOI8-R та ISO-8859-5. Однак це поведінка по замовчуванням можна змінити за допомогою дозволу у парсера спеціального feature "Http://apache.org/xml/features/allow-java-encodings". Якщо цей feature дозволений (за допомогою методу setFeature ()), то парсер після пошуку в таблиці буде намагатися використовувати стандартний Java-вський механізм і відповідно Java-вський набір кодувань. У разі використання інтерфейсу SAX зробити це можна таким, наприклад, чином (при використанні JAXP):
SAXParserFactory parserFactory = SAXParserFactory.newInstance ();
SAXParser parser = parserFactory.newSAXParser ();
parser.getXMLReader (). setFeature ("
Для DOM, на жаль, подібного механізму feature-ів не передбачено, але можна замість JAXP для створення DOM безпосередньо використовувати клас org.apache.xerces.parsers.DOMParser, у якого вже є метод setFeature (). p> Якщо ж Xerces використовується не безпосередньо, а за допомогою іншого пакета, то необхідно налаштувати цей пакет щоб він сам виставляв цей feature. Якщо ж такий можливості не передбачено, то залишається тільки один вихід - правити ручками. Для цього можна або підправити список кодувань в класі org.apache.xerces.readers.MIME2Java або встановити зазначений feature як true за замовчуванням. p> Для читання документа XML з потоку даних звичайно використовується клас org.xml.sax.InputSource. Власне сам потік може бути представлений або у вигляді байтового потоку (java.io.InputStream) або у вигляді потоку символів (Java.io.Reader). Відповідно відповідальність за коректне розпізнавання кодування покладається або на парсер або на того, хто створює об'єкт Reader. У класу InputSource є так само метод setEncoding (), за допомогою якого можна явно задати кодування у разі використання потоку байтів. p> Працює це все таким чином:
Якщо був заданий потік символів (Reader), то він буде використаний для читання даних. Кодування, встановлена ​​методом setEncoding () при цьому ігнорується, як ігнорується та кодування, зазначена в заголовку XML-документа. p> Якщо замість потоку символів був заданий потік байтів ...