Возвращенные значения PHP SimpleXML содержат странные символы вместо дефисов и апострофов - PullRequest
2 голосов
/ 29 января 2011

Я оглянулся и не могу найти решение, так что вот оно.

У меня есть следующий код:

$file = "adhddrugs.xml";
$xmlstr = simplexml_load_file($file);
echo $xmlstr->report_description;

Это простая версия, но даже пробуя это, любые апострофы превращаются в: ^ a (знак евро) знак товарного знака.

Вещи, которые я пробовал:

echo = (string)$xmlstr->report_description; /* did not work */
echo = addslashes($xmlstr->report_description); /* yes I know this doesnt work with hyphens, was mainly trying to see if I could escape the apostrophes */
echo = addslashes((string)$xmlstr->report_description); /* did not work */

также htmlspecial (опять же, я знаю, что не работает с дефисами), htmlentities и несколько других трюков.

Ситуация такова, что я получаю файлы XML из канала, поэтому я не могу их изменить, но они довольно стандартные.Текст с дефисами и т. Д. Инкапсулируется в тег cdata, а кодировка - UTF-8.Если я проверю источник, мне будут показаны дефисы и апострофы в источнике.

Теперь, чтобы посмотреть, была ли кодировка выключена или неправильно маркирована, или что-то еще странное, я попытался просмотреть необработанный XML-файл и убедиться, что он отображается правильно.

Я уверен, что, пытаясь найти ответ, я упустил из виду нечто простое, и тот факт, что я впервые использую SimpleXML, действительно не хватает очень простого решения.Только не приставайте ко мне за это, я действительно пытался найти ответ самостоятельно.

Еще раз спасибо.

Ответы [ 4 ]

4 голосов
/ 29 января 2011

Это простая версия, но даже пробуя это дефис апострофы превращаются в: ^ a (знак евро) знак товарного знака.

Это вызвано неправильным угадыванием кодировки (и, возможно, перекодированием).

Если текст содержит «фигурный апостроф» = «Правая одинарная кавычка» = символ U + 2019, сохранение его в кодировке UTF-8 приводит к байтам 0xE2 0x80 0x99. Если этот же файл затем читается снова при условии, что его кодировка - windows-1252, поток байтов символа апостроф (0xE2 0x80 0x99) интерпретируется как символы ’ (= маленькое "a" с круговым выражением, знак евро, знак товарного знака). Опять же, если этот неверно интерпретированный текст сохраняется как UTF-8, исходный символ приводит к потоку байтов 0xC3 0xA2 0xE2 0x82 0xAC 0xE2 0x84 0xA2

Сводка: Ваши исходные данные - UTF-8, и некоторая часть вашего кода, считывающего данные, предполагает, что это windows-1252 (или ISO-8859-1, который обычно фактически рассматривается как windows-1252). Вероятная причина для этого предположения набора символов состоит в том, что набор символов по умолчанию для HTTP - ISO-8859-1. «Когда отправителем не предоставлен явный параметр charset, для медиа-подтипов типа« text »определяется значение charset по умолчанию« ISO-8859-1 »при получении через HTTP. ' Источник: RFC 2616, протокол передачи гипертекста - HTTP / 1.1

PS. это очень распространенная проблема. Просто выполните поиск в Google или Bing с запросом doesn’t -doesn't, и вы увидите много страниц с такой же ошибкой кодирования.

2 голосов
/ 29 января 2011

Знаете ли вы набор символов документа?

Вы можете сделать header('Content-Type: text/html; charset=utf-8'); перед печатью любого содержимого, если вы этого еще не сделали.

2 голосов
/ 29 января 2011

Убедитесь, что вы настроили SimpleXML для использования также UTF-8.

Убедитесь, что все сущности закодированы с использованием шестнадцатеричной записи, а не сущностей HTML.

Также возможно:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");

поможет.

0 голосов
/ 31 июля 2015

Это признак объявления неверного набора символов в разделе <head> на вашей странице (или не декларирования и использования набора символов по умолчанию без акцентов и специальных символов).

Это делает трюк для латинскогоязыки.

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Для ВСЕГО НОВОСТЕЙ HTML-страницы для браузеров имеют базовый макет с HEAD или HEADER, который служит для того, чтобы рассказать браузеру некоторые основные сведения о странице, а также предварительно загрузить некоторые сценарии, которыестраница будет использовать для достижения своей функциональности (ий).

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>
  Hello world
 </body>
</html>

, если пропущен раздел <head>, html будет использовать значения по умолчанию (принимать некоторые вещи как должное - как, например, использование набора символов североамериканского алфавита, который НЕ делаетвключает в себя множество акцентированных букв, которые отображаются как «странные символы».

...