5

我试图以 htmlencoded 方式输出一个字符串,并且该htmlentities()函数始终返回一个空字符串。

我确切地知道它为什么这样做。好吧,我没有运行 PHP 5.4 我安装了最新的 PHP 5.3 版本。

问题是我将如何能够对具有无效代码单元序列的字符串进行 htmlencode。

根据手册,ENT_SUBSTITUTE是要走的路。但是这个常量在 PHP 5.3.X 中没有定义。

我这样做了:

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

仍然没有运气。htmlentities仍然返回空字符串。

我想尝试一下ENT_DISALLOWED,但我找不到它对应的 long 值。

所以我的问题是两个折叠

  1. PHP 5.4 的常量值是ENT_DISALLOWED多少?

  2. 如何确保可以清除包含非 UTF-8 字符(例如智能引号)的字符串?- 不仅仅是智能引号,还有任何导致htmlentities()返回空白字符串的东西。

4

2 回答 2

3

确实,htmlentities()在 PHP 5.3 中没有ENT_SUBSTITUTE标志,但是它有(不是真正建议的)ENT_IGNORE标志。注意注意事项并在使用前尝试理解它:

不鼓励使用此标志,因为它可能具有安全隐患

最好首先了解输入字符串存在问题的原因。大多数情况下,用户只是缺少指定正确的编码。

例如,首先将字符串重新编码为 UTF-8,然后将其传递给htmlspecialchars()or htmlentities()。说到智能引号,您可能正在使用 Windows-1252 编码的字符串。您甚至不需要在使用前进行转换,您只需正确指定字符集(PHP 5.3):

htmlentities($string, ENT_QUOTES, $encoding = 'Windows-1252');

当然,这只适用输入$string以 Windows-1252 (CP1252) 编码的情况。首先找出正确的编码,然后它通常没有问题。对于不支持的编码,首先重新编码为支持的编码,例如使用iconvmb_string

于 2013-05-11T12:27:24.643 回答
2

如您所说,添加了这些常量5.4.0. 问题是,支持也是新的5.4.0。这意味着您可以传递任何您想要的值,老年人htmlentities不会理解它。

最有可能的情况是,php changelog 非常具有误导性。

于 2012-09-24T21:18:02.203 回答