浅析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 相关文章推荐
使用PHP批量生成随机用户名
Jul 10 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
php解析url的三个示例
Jan 20 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
yii2 上传图片的示例代码
Nov 02 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
php cookie 详解使用实例
2016/11/03 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
用原生js做单页应用
2017/01/17 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python安装selenium包详细过程
2019/07/23 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
给物业的表扬信
2014/01/21 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
不同意离婚上诉状
2015/05/23 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python