Проблемы кодировки XML с акцентами - PullRequest
3 голосов
/ 01 июля 2011

У меня была проблема несколько раз при работе над проектами, и я хотел бы знать, есть ли элегантное решение.

Проблема Я вытаскиваю твиты через XML из твиттера и загружаю их в свою БД, однако при выводе их на экран я получаю следующие символы:

"переехал в Дюссельдорф." ИЛИ ЖЕ Тамби & Atilde; & копия; п

и если у меня есть русские иероглифы, я получу много уродливых ящиков на месте.

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

Что я использую

  • PHP, MYSQL

После прочтения в файле XML я делаю следующее для очистки данных:

    $data = trim($data);
    $data = htmlentities($data);
    $data = mysql_real_escape_string($data);

Сортировка моей базы данных: utf8_general_ci

Набор символов веб-страницы: charset = UTF-8

Я думаю, что это может иметь какое-то отношение к сущностям HTML, но я действительно ценю решение, которое работает по всем направлениям в проектах.

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 01 июля 2011

Замените эту строку:

$data = htmlentities($data);

На это:

$data = htmlentities($data, null, "UTF-8");

Таким образом, htmlentities () оставит только допустимые символы UTF-8.Для получения дополнительной информации см. документацию для htmlentities () .

2 голосов
/ 01 июля 2011

Вам необходимо изменить кодировку вашего соединения на UTF-8 (обычно это iso-8859-1).См. Здесь: Как я могу сохранить символ '€' в MySQL, используя PHP?

Вызов htmlentities() не требуется, если вы правильно настроили кодирование.Я бы удалил это полностью.Вам просто нужно быть осторожным, чтобы использовать htmlspecialchars(), когда выводит данных a в контексте HTML.

0 голосов
/ 01 июля 2011

Нельзя использовать htmlentities() в состоянии по умолчанию для данных XML, поскольку эта функция создает объекты HTML, а не объекты XML.

Разница в том, что HTML DTD определяет набор кодов сущностей, которые веб-браузеры запрограммированы для интерпретации. Но большинство XML DTD не определяют их (если XML даже имеет DTD).

Единственными кодами доступа, которые по умолчанию доступны для XML, являются >, < и &. Все остальные объекты должны быть представлены с использованием их числового объекта.

PHP не имеет функции xmlentities(), но если вы прочитаете страницу руководства для htmlentities(), вы увидите в комментариях, что у многих людей была такая же проблема, и разместили свои решения. После быстрого просмотра я бы посоветовал посмотреть на тот, который называется philsXMLClean().

Надеюсь, это поможет.

0 голосов
/ 01 июля 2011

Убедитесь, что вы задали внутреннюю кодировку php для UTF8 с помощью iconv_set_encoding и что вы вызываете htmlentities с информацией о кодировке, как сказал EdoDodo. Также убедитесь, что вы храните базы данных с кодировкой UTF8, хотя говорите, что это уже так.

...