生成 PHP SimpleXML RSS 提要时出现 UTF8 错误

Posted

技术标签:

【中文标题】生成 PHP SimpleXML RSS 提要时出现 UTF8 错误【英文标题】:UTF8 Errors on generating PHP SimpleXML RSS feed 【发布时间】:2012-02-06 11:33:01 【问题描述】:

我正在为一个站点创建一个 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();

提前谢谢...

伦纳德

【问题讨论】:

您是否也将mysql connection encoding 设置为UTF8? @Jon 是的。 mysql_client_encoding() 返回 'utf8' 您确定您正在使用 UTF-8 连接到数据库吗?建立连接后,第一次执行此查询:mysql_query("SET NAMES 'utf8'"); 我添加了上面的代码,结果相同。如前所述,我运行了 mysql_client_encoding() 并返回 utf8。 atxba 为您提供了一个很好的提示。问题是,htmlentities() 在标准模式下不能在 utf-8 中工作。像这样使用它: htmlentities ($string,ENT_NOQUOTES, 'UTF-8');标准是 ISO-8859-1。所以你必须改变它。 “ENT_NOQUOTES”表示不会替换任何引号。对于其他值,请查看手册htmlentitie() 【参考方案1】:

我能够重现您的问题,将您的 $nodes ... sn-p 替换为

class myNode 

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

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



$nodes = array(new myNode());

简单地删除对 htmlentities 的调用似乎可以正常工作。 (输出被正确转义为字符实体)

【讨论】:

好的,这行得通。我正在运行 htmlentities,因为我在数据库中有一些条目具有 & 字符而不是 &.... 或者,您也可以指定 htmlentities 的字符集,例如 htmlentities(strip_tags($node->title), ENT_COMPAT,'utf-8');这对我也有用 谢谢。作为记录,我无法让它与 htmlentities 一起使用,因为我不断得到未定义的实体 'lsquo'。我切换到使用 htmlspecialchars 并且它起作用了......

以上是关于生成 PHP SimpleXML RSS 提要时出现 UTF8 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 SimpleXML 读取 RSS 提要

如何从 php 中的 rss 提要获取图像

PHP SimpleXML:提要修改

PHP 在PHP中使用SimpleXML生成RSS源

解析 XML(RSS 提要)的 PHP 错误

当我尝试做 simplexml_load_file 时出现 XML 错误