我正在用PHP编写一些RSS提要并且在处理字符编码问题。我应该在htmlentities()编码之前或之后使用utf8_encode()吗?例如,我在描述元素中都有&符号和中文字符,我不确定哪一个是正确的:
$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));
为什么?
答案 0 :(得分:17)
将字符集传递给htmlentities函数非常重要,因为默认值为ISO-8859-1:
utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8'));
您应首先应用htmlentities以允许utf8_encode正确编码实体。
(编辑:我之前的意见改变了,根据评论,订单无关紧要。这段代码经过测试并运作良好)。
答案 1 :(得分:14)
首先:utf8_encode
function从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')
答案 2 :(得分:7)
不要使用htmlentities()
!
只需使用UTF-8字符。只需确保在第一行使用Content-Type:application/xml;charset=UTF-8
在Feed自身中声明HTTP标头(<?xml version="1.0" encoding="UTF-8"?>
)中的Feed的编码或失败,
答案 3 :(得分:2)
可能更容易忘记htmlentities并使用CDATA部分。它适用于标题部分,在Firefox的RSS查看器中似乎不支持编码的HTML字符:
<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title>
答案 4 :(得分:1)
你想做$output = htmlentities(utf8_encode($source));
。这是因为您希望首先将国际字符转换为正确的UTF8,然后将&符号(可能还有一些UTF-8字符)转换为HTML实体。如果先执行实体,则可能无法正确处理某些国际字符。
如果utf8_encode不会更改您的国际字符,那么您调用它们的顺序无关紧要。
答案 5 :(得分:0)
经过多次试验&amp;错误,我终于找到了一种方法来正确显示从utf8编码的数据库值,通过xml文件到html页面的字符串:
$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';
我希望这有助于某人。