浅析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 相关文章推荐
php5.2.0内存管理改进
Jan 22 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
CodeIgniter扩展核心类实例详解
Jan 20 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
php的socket编程详解
Nov 20 PHP
如何用PHP websocket实现网页实时聊天
May 26 PHP
PHP使用QR Code生成二维码实例
Jul 07 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
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python获取交互式ssh shell的方法
2019/02/14 Python
详解Python中的测试工具
2019/06/09 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
医药营销个人求职信
2014/04/12 职场文书
保护环境倡议书
2014/04/14 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
2014年工程工作总结
2014/11/25 职场文书
交通事故和解协议书
2015/01/27 职场文书