详解PHP中strlen和mb_strlen函数的区别


Posted in PHP onMarch 07, 2014

在PHP里有两个计算字符串个数的函数
一个是 strlen,一个是mb_strlen;
先来看看手册中的定义
strlen
strlen — 获取字符串长度
int strlen ( string $string )
返回给定的字符串 string 的长度。

mb_strlen
int mb_strlen ( string $str [, string $encoding ] )
返回给定的字符串 string 的长度。
encoding参数为字符编码。如果省略,则使用内部字符编码。

这么看除了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核心函数,Windows 下使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。Linux 下需要编译这个扩展。
 

PHP 相关文章推荐
PHP的FTP学习(四)
Oct 09 PHP
11个PHP 分页脚本推荐
Aug 15 PHP
php适配器模式介绍
Aug 14 PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
php通过各种函数判断0和空
Jul 04 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 #PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 #PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 #PHP
体育彩票排列三组选三算法分享
Mar 07 #PHP
PHP错误和异长常处理总结
Mar 06 #PHP
php发送post请求函数分享
Mar 06 #PHP
PHP empty函数报错解决办法
Mar 06 #PHP
You might like
基于php上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
javascript 动态添加表格行
2006/06/22 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
Django如何将URL映射到视图
2019/07/29 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
《美丽的小路》教学反思
2014/02/26 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
2015年财政所工作总结
2015/04/25 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
Python中time与datetime模块使用方法详解
2022/03/31 Python