PHP中strlen()和mb_strlen()的区别浅析


Posted in PHP onJune 19, 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:

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 相关文章推荐
输出控制类
Oct 09 PHP
php采集时被封ip的解决方法
Aug 29 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
php模板引擎技术简单实现
Mar 15 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 #PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 #PHP
PHP base64编码后解码乱码的解决办法
Jun 19 #PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 #PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 #PHP
ThinkPHP CURD方法之field方法详解
Jun 18 #PHP
You might like
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
php正则修正符用法实例详解
2016/12/29 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
javascript prototype 原型链
2009/03/12 Javascript
javascript json2 使用方法
2010/03/16 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
javascript判断office版本示例
2014/04/11 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
python通过opencv实现批量剪切图片
2017/11/13 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
学习Django知识点分享
2019/09/11 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
性能服装:HYLETE
2018/08/14 全球购物
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
乡镇四风对照检查材料
2014/08/31 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
颐和园英文导游词
2015/01/30 职场文书
管理人员岗位职责
2015/02/14 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python