浅析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 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
关于PHP5 Session生命周期介绍
Mar 02 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
php实现监听事件
Nov 06 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
如何删除多级目录
2006/10/09 PHP
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
php遍历目录viewDir函数
2009/12/15 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python中dir函数用法分析
2015/04/17 Python
python距离测量的方法
2018/03/06 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
python爬虫要用到的库总结
2020/07/28 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
通信工程求职信
2014/07/16 职场文书
欠条样本
2015/07/03 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers