繁体   English   中英

RSS Feed中的utf-8和htmlentities

[英]utf-8 and htmlentities in RSS feeds

我正在用PHP编写一些RSS提要并且正在处理字符编码问题。 我应该在htmlentities()编码之前或之后使用utf8_encode()吗? 例如,我在描述元素中有两个&符号和中文字符,我不确定哪个是正确的:

$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));

为什么?

将字符集传递给htmlentities函数非常重要,因为默认值为ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8'));

您应首先应用htmlentities以允许utf8_encode正确编码实体。

(编辑:我之前的意见改变了,根据评论,订单无关紧要。此代码经过测试并且运行良好)。

第一: utf8_encode函数从ISO 8859-1转换为UTF-8。 因此,如果输入编码/字符集是ISO 8859-1,则只需要此功能。 但是你为什么不首先使用UTF-8?

第二:你不需要htmlentities 您只需要htmlspecialchars来替换字符引用的特殊字符。 htmlentities将替换可以使用UTF-8直接编码的“太多”字符。 重要的是,您还使用ENT_QUOTES引号样式替换单引号。

所以我的提议:

// if your input encoding is ISO 8859-1
htmlspecialchars(utf8_encode($string), ENT_QUOTES)

// if your input encoding is UTF-8
htmlspecialchars($string, ENT_QUOTES, 'UTF-8')

不要使用htmlentities()

只需使用UTF-8字符。 只需确保在HTTP标头( Content-Type:application/xml;charset=UTF-8 )中声明feed的编码或使用<?xml version="1.0" encoding="UTF-8"?>在Feed本身中失败<?xml version="1.0" encoding="UTF-8"?>在第一行。

忘记htmlentities并使用CDATA部分可能更容易。 它适用于标题部分,在Firefox的RSS查看器中似乎不支持编码的HTML字符:

<title><![CDATA[News & Updates  " > » ☂ ☺ ☹ ☃  Test!]]></title>

你想做$output = htmlentities(utf8_encode($source)); 这是因为您希望首先将国际字符转换为正确的UTF8,然后将&符号(可能还有一些UTF-8字符)转换为HTML实体。 如果先执行实体,则可能无法正确处理某些国际字符。

如果utf8_encode不会更改您的国际字符,那么您调用它们的顺序无关紧要。

经过多次试验和错误,我终于找到了一种方法,可以正确显示从utf8编码的数据库值到xml文件的字符串到html页面:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';

我希望这可以帮助别人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM