php - 在 htmlentities 中使用 php 5.4 的新常量 ENT_DISALLOWED

标签 php utf-8 php-5.3 porting html-entities

我试图以 html 编码的方式输出一个字符串,并且 htmlentities() function总是返回一个空字符串。

我很清楚为什么会这样。好吧,我没有运行 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 字符(例如 smart quotes )的字符串? - 不仅是智能引号,还有任何导致 htmlentities() 返回空白字符串的内容。

最佳答案

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

Using this flag is discouraged as it » may have security implications.

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

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

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

当然,这仅适用于 如果 输入 $string 在 Windows-1252 (CP1252) 中编码。先找出正确的编码,一般就没问题了。对于不支持的编码,首先重新编码为支持的编码,例如 iconvmb_string .

关于php - 在 htmlentities 中使用 php 5.4 的新常量 ENT_DISALLOWED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468786/

相关文章:

php - 比特币支付,OP_RETURN 参数

php - foreach 改变最后一个元素

php - 比较两个表,从表中获取值并将其相乘 - PHP MySQL

php - Elasticsearch-php查询

php - 单击按钮时的随机图像

python - PyCharm 调试器中的 UnicodeDecodeError

php - 使用Json编码的php和java android之间的特殊字符

c# - (new Utf8Encoding()).GetPreamble() 的前导为空 - 很奇怪

PHP 类型提示错误?

SQLite 调用未定义函数 sqlite_open() 的 PHP 问题