详解PHP中strlen和mb_strlen函数的区别


Posted in PHP onMarch 07, 2014

在PHP里有两个计算字符串个数的函数
一个是 strlen,一个是mb_strlen;
先来看看手册中的定义
strlen
strlen — 获取字符串长度
int strlen ( string $string )
返回给定的字符串 string 的长度。

mb_strlen
int mb_strlen ( string $str [, string $encoding ] )
返回给定的字符串 string 的长度。
encoding参数为字符编码。如果省略,则使用内部字符编码。

这么看除了mb_strlen可以传递一个字符编码好像没有其他区别,下面通过例子,讲解这两者之间的区别。
先看例子:

<?php    //测试时文件的编码方式要是UTF8    
$str='中文a字1符';    
echo strlen($str).'<br>';//14    
echo mb_strlen($str,'utf8').'<br>';//6    
echo mb_strlen($str,'gbk').'<br>';//8    
echo mb_strlen($str,'gb2312').'<br>';//10    
?>

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)

echo (strlen($str) + mb_strlen($str,'UTF8')) / 2; 

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10。

echo mb_internal_encoding();

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

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。
需要注意的是,mb_strlen并不是PHP核心函数,Windows 下使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。Linux 下需要编译这个扩展。
 

PHP 相关文章推荐
在PHP中利用XML技术构造远程服务(上)
Oct 09 PHP
配置最新的PHP加MYSQL服务器
Oct 09 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
php猴子选大王问题解决方法
May 12 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
php简单的上传类分享
May 15 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 PHP
PHP goto语句用法实例
Aug 06 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 #PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 #PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 #PHP
体育彩票排列三组选三算法分享
Mar 07 #PHP
PHP错误和异长常处理总结
Mar 06 #PHP
php发送post请求函数分享
Mar 06 #PHP
PHP empty函数报错解决办法
Mar 06 #PHP
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
ThinkPHP路由详解
2015/07/27 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
js实现批量删除功能
2020/08/27 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Python OpenCV获取视频的方法
2018/02/28 Python
TensorFlow实现模型评估
2018/09/07 Python
Python 编程速成(推荐)
2019/04/15 Python
Python异常处理例题整理
2019/07/07 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
总监职责范文
2013/11/09 职场文书
学生党员公开承诺书
2014/05/28 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
使用pytorch实现线性回归
2021/04/11 Python
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android