Wednesday, March 15, 2006

Кодировки в XML

Для указания того, какая кодировка была использована используется заголовок XML-документа.
Пример:

<?xml version="1.0" encoding="windows-1251"?>


Если кодировка указана не была, то по умолчанию предполагается кодировка 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(
"http://apache.org/xml/features/allow-java-encodings",true);


Отсюда

Вот эта сама фича с кодировками отняла полдня :(

2 comments:

Daniel Feygin said...
This comment has been removed by a blog administrator.
Daniel Feygin said...

Все верно, только парсеры обязаны поддерживать не только UTF-8, но и UTF-16 (см. http://www.w3.org/TR/2004/REC-xml-20040204/#charsets). Разница лишь в том, что XML в UTF-16 должен начинаться с юникодовского byte order mark, а если его нет, то по умолчанию используется UTF-8.

Что касается названий кодировок, то их следует брать отсюда: http://www.iana.org/assignments/character-sets.