很多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。 首先查看简介: htmlentities() 函数把字符转换为 HTML 实体。 htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是: & (和号)成为 & " (双引号)成为 " ' (单引号)成为 ' < (小于)成为 < > (大于)成为 > `htmlspecialchars` 只转化上面这几个html代码,而 `htmlentities` 却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。 我们可以使用简单的例子来做比较: $str='测试页面'; echo htmlentities($str); // ²âÊÔÒ³Ãæ $str='测试页面'; echo htmlspecialchars($str); // 测试页面 另外参考一下这个自定义函数: function my_excerpt( $html, $len ) { // $html 应包含一个 HTML 文档。 // 本例将去掉 HTML 标记,javascript 代码 // 和空白字符。还会将一些通用的 // HTML 实体转换成相应的文本。 $search = array ("''si", // 去掉 javascript "'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 标记 "'([\r\n])[\s]+'", // 去掉空白字符 "'&(quot|#34);'i", // 替换 HTML 实体 "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'(\d+);'e"); // 作为 PHP 代码运行 $replace = array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)"); $text = preg_replace ($search, $replace, $html); $text = trim($text); return mb_strlen($text) >= $len ? mb_substr($text, 0, $len) : ''; } `htmlspecialchar()`函数和 `htmlentities()` 函数类似都是把html代码转换,`htmlspecialchars_decode`是把转化的html的编码转换成转换回来。 我们可以使用简单的例子来做比较: $str='测试'; $transstr = htmlspecialchars($str) ; echo $transstr . ""; echo htmlspecialchars_decode($transstr)"; 运行上面的代码,就可以看出两者的差别了。 结论是,有中文的时候,最好用 `htmlspecialchars` ,否则可能乱码。 难道 `htmlentities` 函数只有一个参数吗?当然不是!`htmlentities` 还有三个可选参数,分别是: `$quote_style`、 `$charset`、 `$double_encode`,手册对 `$charset` 参数是这样描述的: `Defines character set used in conversion. The default character set is ISO-8859-1.` 从上面程序输出的结果判断,`$str` 是 `GB2312` 编码的,“测试页面”几个字对应的十六进制值是: `B2 E2 CA D4 D2 B3 C3 E6` 然而却被当成 `ISO-8859-1` 编码来解析: ²âÊÔÒ³Ãæ 正好对应 `HTML character entity` 里的: ²âÊÔÒ³Ãæ 当然会被 `htmlentities` 转义掉,但是只要加上正确的编码作为参数,根本就不会出现所谓的中文乱码问题: $str='测试页面'; echo htmlentities($str, ENT_COMPAT, 'gb2312'); // 测试页面三人成虎,以讹传讹。 结 论: `htmlentities` 和 `htmlspecialchars` 的区别在于: `htmlentities` 会转化所有的 `html character entity` `htmlspecialchars` 只会转化手册上列出的几个 `html character entity` (也就是会影响 html 解析的那几个基本字符)。 一般来说,使用 `htmlspecialchars` 转化掉基本字符就已经足够了,没有必要使用 `htmlentities`。实在要使用 `htmlentities` 时,要注意为第三个参数传递正确的编码。