详解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 相关文章推荐
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php实现微信发红包
Dec 05 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
php注册登录系统简化版
Dec 28 PHP
php自定义函数转换html标签示例
Sep 29 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
php中in_array函数用法探究
2014/11/25 PHP
PHP开发注意事项总结
2015/02/04 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
python中xrange和range的区别
2014/05/13 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
JAVA代码查错题
2014/10/10 面试题
会计自我鉴定范文
2013/10/06 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
电子银行营销方案
2014/02/22 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
民族学专业求职信
2014/07/28 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
浅析Django接口版本控制
2021/06/26 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL