2011-01-11 4 views
0

Я создаю API, который возвращает XML-код. Например, API будет возвращать:Ошибка utf8_decode с амперсандом (&)

<message>hello, this is a message &amp; it used htmlsepcialchars</message> 

Я использую file_get_contents() и simplexml_load_string() для загрузки возвращенной информации в массив.

Затем я использовал utf8_decode(), чтобы преобразовать сообщение в дружественную кодировку на принимающем веб-сайте. Тем не менее, я получаю следующее сообщение что указывает контактный к амперсандом (&) в сообщении:

Warning: main() [function.main]: unterminated entity reference 

В связи с амперсандом, остальная часть сообщения обрезается. Любые идеи, как обойти эту проблему?

+1

Возможно, 'simplexml_load_string()' рендерит '&' в просто амперсанд? Возможно, повторное кодирование поможет. ('htmlentities()' может помочь здесь.) – Amber

+0

Быстрый комментарий: вам не нужно 'file_get_contents()', просто используйте 'simplexml_load_file ('/ path/to/file');' - также укажите ссылку к файлу, который производит эту ошибку. –

ответ

0

Нашел ответ, пользовательская ошибка. Я в основном убегал где-то в моем коде.

0

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

Обычно специальные символы должны быть помещены в поля CDATA. это избавляет от необходимости кодирования. php Функции создания DOM имеют то, что вам нужно.


$doc->createCDATASection 

и конечно:

http://www.w3schools.com/Xml/xml_cdata.asp

и http://fr.php.net/manual/en/function.domdocument-create-cdata-section.php

+0

Практически нет сценария, в котором вам интересны * не * «кодировать» (или избегать, а не специальные символы). Вы не хотите слепо помещать текст между '' и надеяться, что текст не содержит что-то, что сделает ваш XML недействительным. Если вы используете методы DOM, вход автоматически экранируется, в том числе для CDATA, поэтому проблем нет. –

+0

Вот почему я сказал, что это спасло его от неприятностей. – cromestant

0

Ну, SimpleXml строки должны быть utf8 закодированы, и значения организации должны быть экранированы. Действительно ли utf_decode() действительно необходим в вашем коде?

+0

SimpleXML не ограничивается UTF-8, он может загружать большинство кодировок, пока файл действителен (IOW, пока объявлена ​​правильная кодировка). –