Ошибки UTF8 при создании RSS-канала PHP SimpleXML

Я создаю RSS-канал для сайта.

Я использую SimpleXML для создания структуры XML. Когда я вызываю $ xml-> asXML ();, он выдает много предупреждений:

ErrorException [ Warning ]: SimpleXMLElement::asXML() [simplexmlelement.asxml]: string is not in UTF-8

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

//First create the XML root
$xml = new SimpleXMLElement('<rss version="2.0"></rss>');

//Create the Channel
$channel = $xml->addChild('channel');

//Construct the feed parameters
$channel->addChild('title', 'CGarchitect Feed');
$channel->addChild('link', Config::get('base_url'));
$channel->addChild('description', 'CGarchitect is the leading online community for architectural visualization professionals.');
$channel->addChild('pubDate', date("D, d M Y H:i:s T"));

//Get the feed items

$nodes = <....snip... >

foreach ($nodes as $node)
{

    //Parse the title and description
    $title = htmlentities(strip_tags($node->title));
    $description = htmlentities(strip_tags($node->description));
    $newItem = $channel->addChild('item');
    $newItem->addChild('title', $title);
    $newItem->addChild('description', $description);
    $newItem->addChild('pubDate', date("D, d M Y H:i:s T", $node->published_at));

}

header('Content-Type: application/xhtml+xml');
echo $xml->asXML();

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

Леонард


person Leonard Teo    schedule 09.01.2012    source источник
comment
Установили ли вы кодировку соединения MySql в UTF8 как хорошо?   -  person Jon    schedule 10.01.2012
comment
@Jon Да. mysql_client_encoding () возвращает utf8   -  person Leonard Teo    schedule 10.01.2012
comment
Вы уверены, что используете соединение UTF-8 с базой данных? Сделайте этот запрос в самый первый раз после того, как вы установили соединение: mysql_query (SET NAMES 'utf8');   -  person Michael Walter    schedule 10.01.2012
comment
Я добавил приведенный выше код с тем же результатом. Как уже упоминалось, я запустил mysql_client_encoding (), и он вернул utf8.   -  person Leonard Teo    schedule 10.01.2012
comment
У atxba есть хорошая подсказка для вас. проблема в том, что htmlentities () не работает в utf-8 в стандартном режиме. используйте его так: htmlentities ($ string, ENT_NOQUOTES, 'UTF-8'); стандарт ISO-8859-1. Так что вы должны это изменить. ENT_NOQUOTES означает, что кавычки не будут заменены. другие значения см. в руководстве htmlentitie ()   -  person Michael Walter    schedule 10.01.2012
comment
re: utf8_general_ci stackoverflow.com/a/1036459/183677 ... очень сломанный, хех. если вы опубликовали фактическую строку, которая не работает, вы можете проверить ее с помощью какой-либо утилиты, например hexutf8.com/?q=c2a9981a800. Я предполагаю, что MySQL хранит некоторые искаженные байты UTF8, а SimpleXMLElement это не нравится.   -  person jar    schedule 08.09.2016


Ответы (1)


Мне удалось воспроизвести вашу проблему, заменив фрагмент $ nodes ... на

class myNode {

    public $title="(╯°□°)╯︵ ┻━┻";
    public $description="dscr";
    public $published_at=0;

    public function __construct(){
        $this->published_at=time();
    }

}

$nodes = array(new myNode());

Простое удаление вызовов htmlentities, похоже, сработало нормально. (Вывод был правильно экранирован как символьные сущности)

person atxdba    schedule 10.01.2012
comment
Хорошо, это работает. Я запускал htmlentities, потому что у меня были некоторые записи в базе данных, в которых был символ &, но он не был .... - person Leonard Teo; 10.01.2012
comment
Или, в качестве альтернативы, вы можете указать кодировку для htmlentities, например htmlentities (strip_tags ($ node- ›title), ENT_COMPAT, 'utf-8'); Это работает и для меня - person atxdba; 10.01.2012
comment
Спасибо. Для записи, мне не удалось заставить его работать с htmlentities, так как я продолжал получать Entity 'lsquo not defined. Я перешел на использование htmlspecialchars, и это сработало ... - person Leonard Teo; 10.01.2012