10

我正在用 PHP 编写一些 RSS 提要并遇到字符编码问题。我应该在 htmlentities() 编码之前还是之后使用 utf8_encode()?例如,我在描述元素中同时包含 & 和中文字符,我不确定哪些是正确的:

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

为什么?

4

6 回答 6

18

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

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

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

(编辑:我改变了我之前的观点,根据评论顺序并不重要。这段代码已经过测试并且运行良好)。

于 2008-11-21T02:28:48.537 回答
15

首先:该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')
于 2009-01-26T09:58:09.697 回答
7

不要使用htmlentities()

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

于 2008-11-26T21:39:27.807 回答
2

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

<title><![CDATA[News & Updates  " > » ☂ ☺ ☹ ☃  Test!]]></title>
于 2009-01-26T07:21:31.977 回答
1

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

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

于 2008-11-21T02:20:25.107 回答
0

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

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

我希望这可以帮助别人。

于 2009-05-23T00:14:24.537 回答