浅析PHP中strlen和mb_strlen的区别


Posted in PHP onAugust 31, 2014

在PHP中,strlen与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核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

PHP 相关文章推荐
linux下删除7天前日志的代码(php+shell)
Jan 02 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php中异常处理方法小结
Jan 09 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 #PHP
PHP实现数组递归转义的方法
Aug 28 #PHP
PHP之autoload运行机制实例分析
Aug 28 #PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 #PHP
PHP反射机制用法实例
Aug 28 #PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 #PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 #PHP
You might like
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
js获取div高度的代码
2008/08/09 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
JS 判断代码全收集
2009/04/28 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
Angular使用Restful的增删改
2018/12/28 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
Python argv用法详解
2016/01/08 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
tensorflow的计算图总结
2020/01/12 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
环境卫生工作汇报材料
2014/10/28 职场文书
通用员工手册范本
2015/05/14 职场文书
开学随笔
2015/08/15 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis