我正在用 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
) 中声明提要的编码,否则在提要本身中使用<?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 更改,那么您调用它们的顺序无关紧要。
经过反复试验,我终于找到了一种方法,可以通过 xml 文件将字符串从 utf8 编码的数据库值正确显示到 html 页面:
$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';
我希望这可以帮助别人。