详解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 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
php不用正则验证真假身份证
Nov 06 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 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
php动态添加url查询参数的方法
2015/04/14 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python深度优先算法生成迷宫
2018/01/22 Python
浅谈python可视化包Bokeh
2018/02/07 Python
python实现Adapter模式实例代码
2018/02/09 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
PyTorch的torch.cat用法
2020/06/28 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
高考寄语大全
2014/04/08 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
MySQL sql模式设置引起的问题
2022/05/15 MySQL