Разбор XML со специальными символами (UTF-8) - PullRequest
4 голосов
/ 28 февраля 2010

Я начинаю с некоторого XML, который выглядит следующим образом (упрощенно):

<?xml version="1.0" encoding="UTF-8"?>
<alldata>
   <data name="Forsetì" />
</alldata>
</xml>

Но после того, как я проанализировал его с simplexml_load_string, специальный символ (i) становится: ì, что, очевидно, довольно искажено.

Есть ли способ предотвратить это?

Я точно знаю, что XML в порядке, при сохранении в формате .txt и просмотре в браузере символы в порядке. Когда я использую simplexml_load_string в XML, а затем сохраняю значения в виде текстового файла или в базе данных, он искажается.

Ответы [ 5 ]

6 голосов
/ 28 февраля 2010

Похоже, SimpleXML создает строку UTF-8, которая затем отображается в ISO-8859-1 (латиница-1) или что-то похожее на CP-1252.

Когда вы сохраняете результат в файл и передаете этот файл через веб-сервер, браузер будет использовать кодировку, объявленную в файле.

Включая веб-страницу
Так как кодировка вашей веб-страницы не UTF-8, вам необходимо преобразовать строку в любую кодировку, которую вы используете, например, ISO-8859-1 (latin-1).

Это легко сделать с помощью iconv ():

    $xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout);

Сохранение в базе данных
Столбец базы данных не использует параметры сортировки UTF-8, поэтому вы должны использовать iconv для преобразования строки в набор символов, используемый вашей базой данных.

Предполагая, что ваша сортировка базы данных совпадает с кодировкой, в которой вы отображаете, вам не придется ничего делать при чтении из базы данных.

Объяснение
В UTF-8 байт префикса 0xc2 используется для доступа к верхней половине блока «Latin-1 Supplement», который включает такие символы, как акцентированные буквы, символы валюты, дроби, верхний индекс 2 и 3, символы авторского права и зарегистрированного товарного знака, и неразрывный пробел.

Однако в ISO-8859-1 байт 0xC2 представляет Â. Поэтому, когда ваша строка UTF-8 неверно истолковывается как одна из них, вы получаете Â, за которой следует какой-то другой бессмысленный символ.

0 голосов
/ 22 июля 2017

Поздно на вечеринку ... Но я столкнулся с этим и решил, как показано ниже.

Вы объявили кодировку в XML, поэтому, если вы загрузите файл XML с помощью DOMDocument , это не вызовет никаких проблем.

Но если это происходит в другом случае, вы можете использовать html_entity_decode, как показано ниже:

html_entity_decode($xml->saveXML());
0 голосов
/ 28 февраля 2010

У меня также были некоторые проблемы с этим, и это произошло из-за кодировки PHP-скрипта. Убедитесь, что он установлен в UTF-8. Если это все еще не хорошо, попробуйте распечатать переменную, используя uft8_encode или utf8_decode.

0 голосов
/ 28 февраля 2010

XML является строгим, когда дело доходит до сущностей, например & должно быть &amp;amp; и ì должно &amp;igrave;

Так что вам понадобится таблица перевода.

function xml_entity_decode($_string) {
    // Set up XML translation table
    $_xml=array();
    $_xl8=get_html_translation_table(HTML_ENTITIES,ENT_COMPAT);
    while (list($_key,)=each($_xl8))
        $_xml['&#'.ord($_key).';']=$_key;
    return strtr($_string,$_xml);
}
0 голосов
/ 28 февраля 2010

Весьма вероятно, что XML в порядке, но символ искажается при сохранении или выводе.

Если вы выводите данные на HTML-странице: убедитесь, что она также закодирована в UTF-8. Если ваша HTML-страница соответствует ISO-8859-1, вы можете использовать utf8_decode в качестве быстрого решения; использование UTF-8 - лучший вариант в долгосрочной перспективе.

Если вы храните данные в mySQL, вам необходимо выбрать UTF8 в качестве кодировки на всем пути: как кодирование соединения, в таблицу и в столбец (столбцы), в которые вы вставляете данные.

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