详解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 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
使用adodb lite解决问题
Dec 31 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
Aug 06 PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
PHP与SQL语句常用大全
Dec 10 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 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 设置MySQL连接字符集的方法
2011/01/02 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
javascript事件模型代码
2007/07/01 Javascript
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
js实现圆盘记速表
2015/08/03 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
Node.js笔记之process模块解读
2018/05/31 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
Python编写万花尺图案实例
2021/01/03 Python
大一期末自我鉴定
2013/12/13 职场文书
六十大寿答谢词
2014/01/12 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
销售类求职信
2014/06/13 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python