否则可能乱码。 http://www.e-learn.cn/tag/fouzekenengluanma zh-hans php htmlentities和htmlspecialchars 的区别 http://www.e-learn.cn/topic/2079474 <span>php htmlentities和htmlspecialchars 的区别</span> <span><span lang="" about="/user/242" typeof="schema:Person" property="schema:name" datatype="">拟墨画扇</span></span> <span>2019-12-10 09:11:03</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"> <p> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:18px;background-color:#F7FCFF;">很多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。</span> </p> <p> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:18px;background-color:#F7FCFF;"><span></span><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">The translations performed are: 代码如下: </span></span></p> <pre class="brush:php; toolbar: true; auto-links: false;"><code>'&amp;' (ampersand) becomes '&amp;' '"' (double quote) becomes '"' when ENT_NOQUOTES is not set. ''' (single quote) becomes ''' only when ENT_QUOTES is set. '&lt;' (less than) becomes '&lt;' '&gt;' (greater than) becomes '&gt;'</code></pre> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">htmlspecialchars 只转化上面这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">我们可以拿一个简单的例子来做比较: </span>代码如下: <pre class="brush:php; toolbar: true; auto-links: false;"><code>$str='&lt;a href="test.html"&gt;测试页面&lt;/a&gt;'; echo htmlentities($str); // &lt;a href="test.html"&gt;²âÊÔÒ³Ãæ&lt;/a&gt; $str='&lt;a href="test.html"&gt;测试页面&lt;/a&gt;'; echo htmlspecialchars($str); // &lt;a href="test.html"&gt;测试页面&lt;/a&gt;</code></pre> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">结论是,有中文的时候,最好用 htmlspecialchars ,否则可能乱码 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">另外参考一下这个自定义函数 代码如下 <pre class="brush:php; toolbar: true; auto-links: false;"><code>function my_excerpt( $html, $len ) { // $html 应包含一个 HTML 文档。 // 本例将去掉 HTML 标记,javascript 代码 // 和空白字符。还会将一些通用的 // HTML 实体转换成相应的文本。 $search = array ("'&lt;script[^&gt;]*?&gt;.*?&lt;/script&gt;'si", // 去掉 javascript "'&lt;[\/\!]*?[^&lt;&gt;]*?&gt;'si", // 去掉 HTML 标记 "'([\r\n])[\s]+'", // 去掉空白字符 "'&amp;(quot|#34);'i", // 替换 HTML 实体 "'&amp;(amp|#38);'i", "'&amp;(lt|#60);'i", "'&amp;(gt|#62);'i", "'&amp;(nbsp|#160);'i", "'&amp;(iexcl|#161);'i", "'&amp;(cent|#162);'i", "'&amp;(pound|#163);'i", "'&amp;(copy|#169);'i", "'&amp;#(\d+);'e"); // 作为 PHP 代码运行 $replace = array ("", "", "\\1", "\"", "&amp;", "&lt;", "&gt;", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)"); $text = preg_replace ($search, $replace, $html); $text = trim($text); return mb_strlen($text) &gt;= $len ? mb_substr($text, 0, $len) : ''; }</code></pre> </span> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">htmlspecialchar()函数和htmlentities()函数类似都是把html代码转换,htmlspecialchars_decode是把转化的html的编码转换成转换回来。 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">我们可以拿一个简单的例子来做比较: 代码如下 <pre class="brush:php; toolbar: true; auto-links: false;"><code>$str='&lt;a href="test.html"&gt;测试&lt;/a&gt;'; $transstr = htmlspecialchars($str) ; echo $transstr . "&lt;br /&gt;"; echo htmlspecialchars_decode($transstr)";</code></pre> </span> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">运行上面的代码,就可以看出两者的差别了。</span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">一直都知道 PHP 中的 htmlentities 和 htmlspecialchars 函数都能把 html 中的特殊字符转换成对应的 character entity (不知道怎么翻译),也一直都知道 htmlentities 和 htmlspecialchars 函数有区别,但是一直都用不到这两个函数,也就没去研究过到底有什么区别。 </span> <br /><br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">今天用到了,懒得看 PHP 手册里的鸟语,觉得这种问题应该会有人用中文写过,于是 Google 关键词“htmlentities htmlspecialchars”,答案千篇一律。我已经司空见惯了,复制粘贴连小学生都会。经过对比发现,每篇文章大概都包含两部分: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">第一部分是引用 PHP 手册的说明: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">PHP 手册中对 htmlspecialchars 写道: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">The translations performed are: 代码如下 <pre class="brush:php; toolbar: true; auto-links: false;"><code>‘&amp;' (ampersand) becomes ‘&amp;' ‘"' (double quote) becomes ‘"' when ENT_NOQUOTES is not set. ”' (single quote) becomes ‘'' only when ENT_QUOTES is set. ‘&lt;' (less than) becomes ‘&lt;' ‘&gt;' (greater than) becomes ‘&gt;'</code></pre> </span> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">这部分无可厚非,但是第二部分的解释却并不怎么正确: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">htmlspecialchars 只转化上面这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">我们可以拿一个简单的例子来做比较: 代码如下: <pre class="brush:php; toolbar: true; auto-links: false;"><code>&lt;?php $str='&lt;a href="test.html"&gt;测试页面&lt;/a&gt;'; echo htmlentities($str); // &lt;a href="test.html"&gt;²âÊÔÒ³Ãæ&lt;/a&gt; $str='&lt;a href="test.html"&gt;测试页面&lt;/a&gt;'; echo htmlspecialchars($str); // &lt;a href="test.html"&gt;测试页面&lt;/a&gt; ?&gt;</code></pre> </span> <span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">结论是,有中文的时候,最好用 htmlspecialchars ,否则可能乱码。 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">难道 htmlentities 函数只有一个参数吗?当然不是!htmlentities 还有三个可选参数,分别是 $quote_style、 $charset、 $double_encode,手册对 $charset 参数是这样描述的: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">Defines character set used in conversion. The default character set is ISO-8859-1. </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">从上面程序输出的结果判断,$str 是 GB2312 编码的,“测试页面”几个字对应的十六进制值是: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">B2 E2 CA D4 D2 B3 C3 E6 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">然而却被当成 ISO-8859-1 编码来解析: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">²âÊÔÒ³Ãæ </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">正好对应 HTML character entity 里的: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">²âÊÔÒ³Ãæ </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">当然会被 htmlentities 转义掉,但是只要加上正确的编码作为参数,根本就不会出现所谓的中文乱码问题: </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">$str='&lt;a href="test.html"&gt;测试页面&lt;/a&gt;'; </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">echo htmlentities($str, ENT_COMPAT, 'gb2312'); </span> <br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">// &lt;a href="test.html"&gt;测试页面&lt;/a&gt;三人成虎,以讹传讹。 </span> <br /><br /><span style="color:#333333;font-family:Arial, Tahoma, Verdana, sans-serif;font-size:14px;line-height:25px;background-color:#F7FCFF;">结论:htmlentities 和 htmlspecialchars 的区别在于 htmlentities 会转化所有的 html character entity,而htmlspecialchars 只会转化手册上列出的几个 html character entity (也就是会影响 html 解析的那几个基本字符)。一般来说,使用 htmlspecialchars 转化掉基本字符就已经足够了,没有必要使用 htmlentities。实在要使用 htmlentities 时,要注意为第三个参数传递正确的编码。</span> <br /><p></p> <div class="alert alert-success" role="alert"><p>来源:<code>oschina</code></p><p>链接:<code>https://my.oschina.net/u/1163184/blog/165565</code></p></div></div> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field--label">标签</div> <div class="field--items"> <div class="field--item"><a href="/tag/jielunshi" hreflang="zh-hans">结论是</a></div> <div class="field--item"><a href="/tag/youzhongwendeshihou" hreflang="zh-hans">有中文的时候</a></div> <div class="field--item"><a href="/tag/zuihaoyong" hreflang="zh-hans">最好用</a></div> <div class="field--item"><a href="/tag/htmlspecialchars" hreflang="zh-hans">htmlspecialchars</a></div> <div class="field--item"><a href="/tag/fouzekenengluanma" hreflang="zh-hans">否则可能乱码。</a></div> <div class="field--item"><a href="/tag/nandao" hreflang="zh-hans">难道</a></div> <div class="field--item"><a href="/tag/htmlentities" hreflang="zh-hans">htmlentities</a></div> <div class="field--item"><a href="/tag/hanshuzhiyouyigecanshumadangranbushihtmlentities" hreflang="zh-hans">函数只有一个参数吗?当然不是!htmlentities</a></div> <div class="field--item"><a href="/tag/haiyousangekexuancanshu" hreflang="zh-hans">还有三个可选参数</a></div> <div class="field--item"><a href="/tag/fenbieshi" hreflang="zh-hans">分别是</a></div> </div> </div> Tue, 10 Dec 2019 01:11:03 +0000 拟墨画扇 2079474 at http://www.e-learn.cn