Веб и кодирование
Кодировка XML: UTF-8, UTF-16 и XML-декларация
Объявление кодировки XML описывает, как байты документа представляют символы. Оно должно соответствовать байтам и авторитетным метаданным транспорта.
Опубликовано
XML-декларация и имя кодировки
При наличии XML-декларация находится в начале документа. Значение encoding называет фактическую кодировку символов сущности документа; само по себе оно не преобразует байты.
<?xml version="1.0" encoding="UTF-8"?>
<message>Ready</message>UTF-8 и UTF-16
| Кодировка | Полезные свойства | Требование XML |
|---|---|---|
| UTF-8 | Совместима с ASCII и обычно компактна для текста с преобладанием латиницы | Каждый соответствующий стандарту XML-процессор должен её принимать |
| UTF-16 | Использует 16-битные кодовые единицы; порядок байтов можно определить отдельно | Каждый соответствующий стандарту XML-процессор должен её принимать |
Что происходит, если кодировка не указана
При отсутствии авторитетных внешних сведений о кодировке документ без метки порядка байтов и объявления кодировки должен использовать UTF-8. Обычный текст только из ASCII также является корректным UTF-8.
Транспортный протокол, например HTTP, может предоставить внешние сведения о кодировке, поэтому проверяйте вместе байты, декларацию и метаданные транспорта.
Метка порядка байтов и определение UTF-16
Сущность XML в UTF-16 должна начинаться с метки порядка байтов, если механизм более высокого уровня не определяет этот порядок. UTF-8 может использовать BOM, но это не обязательно.
BOM — это сигнатура кодировки, а не текст документа.
Почему несовпадение кодировки приводит к ошибке
Declared: UTF-8
Actual bytes: Windows-1251
Result: decoding error or corrupted text- Сохраняйте файл в кодировке, названной в декларации.
- Передавайте совместимые метаданные HTTP Content-Type.
- Декодируйте загруженные байты до передачи текста браузерному конвертеру.
- Не исправляйте нечитаемые символы заменой после декодирования с потерями.
Проверьте пример
Разберите документ с объявленным UTF-8
Unicode-значение сохраняется после правильного декодирования XML-текста.
<?xml version="1.0" encoding="UTF-8"?><message>Привет, €</message>Ожидаемый результат: JSON-результат сохраняет кириллицу и знак евро.
Проверьте разобранный документ
Преобразуйте XML после проверки кодировки
Правильно декодируйте файл, затем вставьте полученный XML-текст и локально проверьте его отображение в JSON.