在Sourceforge上下载了一个名字叫Simple PHP Forum的论坛程序,学了几个文本处理函数。结果试着用刚刚学的东西写了一个简单的留言板,发现了中文乱码问题,解决后感觉又学到了不少新东西。这几个文本函数是:
- string htmlentities ( string $string [, int $quote_style [, string $charset]] ):将$string中的特殊字符转换成HTML字符。所谓“特殊字符”是诸如“<”、“>”这些被HTML所使用的字符。如果不加转换直接输出到浏览器上,页面就不会显示这些字符或者发生错误。htmlentities将其转换成<、>等等。在用表单提交文本之前勿必先用它处理一下。
<? php
$str = " A 'quote' is <b>bold</b> " ;
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities ( $str );
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities ( $str , ENT_QUOTES);
?> - string nl2br ( string $string ):将$string里的换行符(/n)转换成“<br />”,同样是为了在浏览器中能够正确地显示。这也是在留言本、论坛程序里经常用到的函数。
- string mysql_escape_string ( string $unescaped_string ):将$unescaped_string转换成可以用mysql_query()查询的字符串。别外,这也是避免非法SQL语句的一个简单方法。举个例子:
<? php
$item = " Zak's Laptop " ;
$escaped_item = mysql_escape_string ( $item );
printf ( " %s " , $escaped_item ); // 输出:Zak's Laptop
?>
值得注意的是htmlentities默认情况下(即省略后两个可选参数)不能正确处理中文,中文全成乱码了。一开始我还以为是MySQL的问题,试了很多种方法都不起作用,最后终于将目光锁在了htmlentities上。要让它能正确处理中文,需要通过第三个参数指定字符编码。例如使用UTF-8编码,需要写成:htmlentities($string,ENT_QUOTES,"UTF-8")。可选的字符集见http://au.php.net/manual/zh/function.htmlentities.php。
htmlentities的第二个参数指定对引号的转换方式,用三个选项(常量):
- ENT_COMPAT:转换双引号,忽略单引号;
- ENT_QUOTES:转换双引号和单引号;
- ENT_NOQUOTES:忽略双引号和单引号。