【问题标题】:problem with rss feed and cdataRSS 提要和 cdata 的问题
【发布时间】:2009-05-04 10:10:55
【问题描述】:

我的 RSS 提要有问题。

当我做<title>This is a title </title>

标题在提要中显示得很好

但是当我做 $title = "这是一个倾斜";

<title><![CDATA['$title']]></title>

标题根本没有出现。


还是不行。我动态生成我的 rss 提要,它看起来像这样:

$item_template="
      <item>
         <title>[[title]]</title>
         <link>[[link]]</link>
         <description><![CDATA[[[description]]]]></description>
         <pubDate>[[date]]</pubDate>
      </item>
      ";

在一个循环中:

$s.=str_replace(
array("[[title]]","[[link]]","[[description]]","[[date]]"),
array(htmlentities($row["title"]),$url,$description,$date),
$item_template);

问题出在标题带有欧元符号的情况下。然后它会出现在我的 rss 验证器中,例如:

Â\x80

更多详细信息:

好的,过去几天我一直在为此苦苦挣扎,但找不到解决方案。所以我会开始赏金。这里有更多信息:

  • Feed 中的信息存储在 latin 1 数据库中(由我管理)
  • 当数据库中有欧元符号时出现问题。不管是€还是&amp;euro;
  • 欧元符号有时看起来像奇怪的字符或像 Â\x80
  • 我尝试在 feed 端而不是在 reader 端解决问题。
  • 完整的代码可以在这里找到:codedump
  • 下一步:有时当无法解析欧元符号时,项目(标题或描述)显示为空。因此,如果您在浏览器中显示提要时查看源代码,您会发现 &lt;title&gt;&lt;/title&gt;

如果需要更多信息,请询问。

【问题讨论】:

  • 顺便说一句,不要把英语和德语混在一起。 “数据”听起来很酷,但它是数据的单数。您正在寻找“日期”。来自明斯特(Westf.)的问候
  • 你能告诉我们数据库值的确切值吗(如 base64_encode($row["title"]))?为什么你认为这个值包含欧元符号? (即您是如何输入的,它是否在其他任何地方显示为“€”?)

标签: php rss


【解决方案1】:

问题在于您的输出代码;改变

echo '<title><![CDATA[$title]]></title>';

echo '<title><![CDATA[' . $title . ']]></title>';

作为旁注,请注意以下几点:不要在后续回答您自己的问题,而是编辑原始问题。不要无缘无故地使用正则表达式。不要猜测。

相反,做你应该做的事情:将标题包裹在htmlentitites中并完成,如下所示:

echo '<title>' . htmlentities($title, ENT_NOQUOTES, [encoding]) . '</title>';

[encoding] 替换为您正在使用的字符编码。很可能是“UTF-8”。这是必要的,因为 php(well-written introduction。

我也建议你read about XML。从第二章开始。

【讨论】:

  • 我仍然可以看到您的回答,但感谢您的努力。对不起,我的回答不完整,我应该马上看到的。您还需要指定字符编码。编辑了答案。
  • 好吧,欧元符号仍然存在问题。 $s.=str_replace(array("[[title]]","[[link]]","[[description]]","[[datum]]"), array(htmlentities($row["title "],ENT_NOQUOTES,"UTF-8",false),$url,$description,$datum), $item_template);这会返回一个空标题。
  • @sanders:你为什么要设置 htmlentities 的第四个参数(double_encode)?另外,请检查您的编码是否真的是 UTF-8
  • 我删除了第四个参数。我将它作为 utf8 返回,例如 return utf8_encode($s);但还是没有结果
  • @sanders 抱歉耽搁了这么久。问题是 $s 的编码。试试 $row["title"] = "\xe2\x82\xac"; /* UTF-8 中的 €*/ .这应该产生 。然后看看你的 $s 与 UTF-8 中的 € 有何不同,并追查到原来的问题。
【解决方案2】:

使用htmlspecialchars() 而不是htmlentities()

RSS/ATOM 提要不是 HTML,因此您不能在其中使用 HTML 实体。 XML has only five entities defined by default,所以你不能使用&amp;euro;。由于您使用的是 UTF - 使用文字欧元符号,无需转换(无 htmlentities),但转义其他敏感字符(htmlspecialchars)。

这将是完全有效的 RSS/XML。如果这不能解决问题,则意味着它位于其他地方(请向我提供生成的 RSS 原始源以获得更多帮助)。

【讨论】:

    【解决方案3】:

    您使用哪种编程语言或环境?例如,在 PHP 中,单引号会阻止计算内部变量。

    否则,在这种情况下,您实际上并不需要这些引号。可能你被 PHP 的数组语法弄糊涂了。

    所以你最好写:

    <title><![CDATA[$title]]></title>
    

    【讨论】:

      【解决方案4】:

      我不明白为什么要使用编码函数。当第三方获取您的内容时,将不知道如何解码该字符串。我觉得 - 您应该将 CDATA 用于可能破坏 de XML 的标签 - 使用定义良好的库来编写 XML。对于 PHP:DomDocument 或 XML Writer (http://php.net/manual/en/book.xmlwriter.php)

      【讨论】:

        【解决方案5】:

        我相信 RSS 配置文件不允许这样做:this 文档指出 title 持有,字符数据进一步定义为 as follows

        【讨论】:

          【解决方案6】:

          This article 可能有助于了解有关欧元符号的信息以及在各种情况下的支持。那篇文章中的一些建议包括使用&amp;#8364;&amp;euro;,或者只是将符号替换为“欧元”。祝你好运!

          【讨论】:

            猜你喜欢
            • 2012-10-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-18
            • 1970-01-01
            • 2019-02-15
            • 1970-01-01
            • 1970-01-01
            • 2015-10-06
            相关资源
            最近更新 更多