PHP字符串长度计算 - strlen()函数使用介绍

yipeiwu_com7年前PHP代码库
strlen()函数和mb_strlen()函数

在PHP中,函数strlen()返回字符串的长度。函数原型如下:
复制代码 代码如下:

int strlen(string string_input);

参数string_input为要处理的字符串。

strlen()函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中午字符占两个字节,所以一个中午字符的长度是2。例如
复制代码 代码如下:

<?php
echo strlen("www.sunchis.com");
echo strlen("三知开发网");
?>

“echo strlen("www.sunchis.com");”的运行结果:15

“echo strlen("三知开发网");”的运行结果:15

这里有一个疑问,一个中文字符不是占2个字节吗?“三知开发网”,明明是五个汉字,运行的结果怎么会是15?

原因出在这里:strlen()计算时,对于一个UTF-8的中文字符,会把它当做长度为3来处理。当出现中英文混排的情况下,怎么准确的计算字符串的长度呢?这里,得引入另外一个函数mb_strlen()。mb_strlen()函数的用法与strlen()几乎一摸一样,只是多了一个指定字符集编码的参数。函数原型为:
复制代码 代码如下:

int mb_strlen(string string_input, string encode);

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。 因此,下面的代码能准确计算出中文字符串的长度:
复制代码 代码如下:

<?php
$str = "三知sunchis开发网";
echo strlen($str)."<br>"; //结果:22
echo mb_strlen($str,"UTF8")."<br>"; //结果:12
$strlen = (strlen($str)+mb_strlen($str,"UTF8"))/2;
echo $strlen; //结果:17
?>

原理分析:

strlen()计算时,对待UTF-8的中文字符长度是3,所以“三知sunchis开发网”的长度为5×3+7×1=22
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“三知sunchis开发网”长度为5×1+7×1=12

剩下的就是纯数学问题了,在此就不啰嗦了……

注意:对于mb_strlen($str,'UTF-8'),如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。

相关文章

php微信开发之批量生成带参数的二维码

php微信开发之批量生成带参数的二维码

带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧。  具体...

php中定时计划任务的实现原理

根据php手册简单介绍一些相关的知识: 1.连接处理: 在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况: 0 - NORMAL(正常) 1 - ABORTED(异常退出)...

php和html的区别点详细总结

今天我来和大家讨论下关于PHP技术的另一个简单小问题,就是PHP代码和HTML代码的区别在哪里。 其实,如果简单的说,大家都知道,HTML是典型的静态网络编程用语,而PHP则是一种可实现...

win7下memCache的安装过程(具体操作步骤)

1.下载memcache 的windows 稳定版,解压放某个盘下面,比如在H:/wamp/www/php api/memcache; 2.在终端(即cmd 命令界面)下,输入安装命令...

PHP模拟http请求的方法详解

本文实例讲述了PHP模拟http请求的方法。分享给大家供大家参考,具体如下: 方法一:利用php的socket编程来直接给接口发送数据来模拟post的操作。 建立两个文件post.php...