详解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 相关文章推荐
风格模板初级不完全修改教程
Oct 09 PHP
桌面中心(二)数据库写入
Oct 09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
php执行sql语句的写法
Mar 10 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
php+mysql实现无限分类实例详解
Jan 15 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
php商品对比功能代码分享
Sep 24 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP时间相关常用函数用法示例
Jun 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
php的curl封装类用法实例
2014/11/07 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
IE 当eval遇上function的处理
2011/08/09 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
Python 深入理解yield
2008/09/06 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
python中@contextmanager实例用法
2021/02/07 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
自主招生自荐信格式
2013/12/03 职场文书
运动会表扬稿大全
2014/01/16 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
德语专业求职信
2014/03/12 职场文书
中学生英语演讲稿
2014/04/26 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
实习协议书
2015/01/27 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
SQL写法--行行比较
2021/08/23 SQL Server
关于python爬虫应用urllib库作用分析
2021/09/04 Python
Python自动化实战之接口请求的实现
2022/05/30 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript