
5.3.2 计算字符串的长度
计算字符串的长度经常在很多应用中出现,比如在输入框输入文字的长度就会用到此功能。使用strlen()函数就可以实现这个功能。
strlen()函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中文字符占两个字节,所以一个中文字符的长度是2。以下实例介绍计算字符串长度的方法和技巧。
【例5.4】(实例文件:源文件\ch05\5.4.php)
<?php echo strlen("http://www.php.net/"); echo "<br"; echo strlen("山际见来烟,竹中窥落日。"); ?>
运行结果如图5-4所示。

图5-4 程序运行结果
提示
中文字符串“山际见来烟,竹中窥落日。”中明明是10个汉字和2个标点符号,为什么查询结果中的字符串的长度是36?原因是strlen()在计算时,对于一个UTF-8的中文字符,会把一个汉字的长度当作3个字节计算,所以“山际见来烟,竹中窥落日。”中总共有12个字符,长度为36。
当出现中英文混排的情况时,怎么准确地计算字符串的长度呢?这里需要使用另一个函数mb_strlen()。mb_strlen()函数的用法与strlen()几乎一模一样,只是多了一个指定字符集编码的参数。
mb_strlen()函数的语法格式如下:
int mb_strlen(string string_input, string encode);
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。
下面的案例将准确计算出中文字符串的长度。
【例5.5】(实例文件:源文件\ch05\5.5.php)
<?php echo strlen("山际见来烟,竹中窥落日。"); echo "<br/>"; echo mb_strlen("山际见来烟,竹中窥落日。","UTF8"); ?>
运行结果如图5-5所示。

图5-5 程序运行结果
【案例分析】
(1)strlen()计算时,对待UTF-8的中文字符长度是3,所以“山际见来烟,竹中窥落日。”的长度为12×3=36。
(2)mb_strlen()计算时,选定内码为UTF8,将一个中文字符当作长度1来计算,所以“山际见来烟,竹中窥落日。”长度为12×1=12。