Столкнулся с одним неприятным багом PHP при работе с XML с кодировкой UTF-8. Если воспользоваться функцией DOMDocument::loadXML.
Есть исходный xml-файл: 1.xml
Теперь хотим воспользоваться DOMDocument и подгрузить файл, далее дампим его содержимое на экран. В этом примере все будет работать на ура и результат будет идентичен файлу 1.xml.
Рассмотрим другую ситуацию, когда мы xml-данные как-то получаем, меняем, добавляем и в итоге передаем строку в функцию loadXML.
А на выходе получаем нижеследующее. Куда делись наши символы на русском? И исчезла кодировка UTF-8?
Решение: нужно добавить заголовок xml-файла с кодировкой. Надеюсь в версии PHP 6 они сделают поддержку UTF-8 получше.
XML документы могут содержать символы в различных международных кодировках.
Чтобы не возникало ошибок, необходимо указывать, какая кодировка используется в XML документе, либо сохранять файл в универсальной кодировке UTF-8.
Символьная кодировка
Символьная кодировка определяет уникальный бинарный код для различных символов, используемых в документе.
В компьютерных терминах символьную кодировку также называют символьным набором, символьной раскладкой, кодовым набором и кодом страницы.
Юникод
Юникод — это промышленный стандарт для символьной кодировки текстового документа. Он определяет (почти) все возможные международные символы по именам и числам.
Юникод имеет две разновидности: UTF-8 и UTF-16.
UTF = формат преобразования Юникода (анг. Unicode Transformation Format).
UTF-8 использует один байт (8 бит) для представления общепринятых символов и два (или три) байта для всех остальных символов.
UTF-16 использует два байта (16 бит) для большинства символов и три байта для всего остального.
UTF-8 — Веб-стандарт
UTF-8 — стандартная кодировка символов в сети Интернет.
UTF-8 считается кодировкой по умолчанию в HTML-5, CSS, JavaScript, PHP, SQL и XML.
Кодировка XML документа
Первая строка в XML документе называется прологом:
Пролог является необязательным и, как правило, содержит номер версии XML.
Кроме этого, он может содержать информацию о кодировке XML документа. Следующий пролог определяет кодировку UTF-8:
Стандартизация XML устанавливает, что все приложения XML должны понимать кодировки UTF-8 и UTF-16.
UTF-8 является кодировкой по умолчанию для XML документов без информации о кодировке.
Кроме этого, большинство систем приложений XML работают с такими кодировками, как ISO-8859-1, Windows-1252 и ASCII.
Ошибки XML
Очень часто XML документы создаются на одном компьютере, на сервер выгружается с другого, а в браузере отображаются на третьем компьютере.
Если кодировка некорректно интерпретируется всеми тремя компьютерами, то браузер отобразит бессмысленный набор символов, либо вообще выдаст сообщение об ошибке.
Наилучшим выбором в этом случае будет использование кодировки UTF-8. UTF-8 позволяет отображать практически все международные символы, и, кроме этого, она считается кодировкой по умолчанию, если не указана другая кодировка.
Заключение
Когда вы пишите XML документ:
- Используйте текстовый редактор, который позволяет изменять кодировку документа
- Убедитесь, что редактор настроен на использование нужной кодировки
- Опишите используемую кодировку в соответствующей декларации
- UTF-8 является самой безопасной кодировкой
- UTF-8 является стандартом в сети Интернет
Файл формирующий XML в формате “windows-1251”, сам файл XML в формате UTF-8.
При вводе Латиницы все хорошо. При вводе кириллицы выдает ошибку:
Подскажите как обойти эти камни?
1 ответ 1
Прекрасная манера задавать вопросы.
"Иду в винный магазин, но когда поворачиваю налево, то всегда попадаю на помойку. Подскажите, как добраться до алкоголя?".
Читатель должен сам догадаться, откуда идет горемычный автор, где он сворачивает, и где вообще происходят описываемые события.
"Создаю XML файл. При вводе кирилицы выдает ошибку".
Читатель должен сам догадаться, что вводит автор, куда, и что имеется в виду под словами "ввод" и "кирилица".
При этом пример приводится не того кода, который выдаёт ошибку, а того, который работает нормально.
Ну ок, займемся гаданием.
Если "вводимые" данные прописаны прямо в скрипте, сохранённом в кодировке 1251, то разумеется, они вызовут ошибку. Поскльку данные в кодировке 1251 являются некорректными данными с точки зрения кодировки UTF-8. Следовательно, эти данные сначала надо перекодировать, используя функцию mb_convert_encoding()