浅析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中使用模板的方法
May 24 PHP
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
Oct 29 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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命令行用法
2015/02/04 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
YII框架常用技巧总结
2019/04/27 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
详解python中__name__的意义以及作用
2019/08/07 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
自我鉴定思想方面
2013/10/07 职场文书
检查接待方案
2014/02/27 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
安全生产奖惩制度
2015/08/06 职场文书
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android