详解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常用ODBC函数集(详细)
Jun 24 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
YII框架关联查询操作示例
Apr 29 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
php实现的数组转xml案例分析
Sep 28 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 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文件中是否含有bom的函数
2012/05/31 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python 控制语句
2011/11/03 Python
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python的装饰器用法学习笔记
2016/06/24 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Python lambda表达式用法实例分析
2018/12/25 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python区分不同数据类型的方法
2019/10/14 Python
python带参数打包exe及调用方式
2019/12/21 Python
提升python处理速度原理及方法实例
2019/12/25 Python
Python更新所有已安装包的操作
2020/02/13 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
python复合条件下的字典排序
2020/12/18 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
3.12植树节活动总结2014
2014/03/13 职场文书
国旗下的演讲稿
2014/05/08 职场文书
社团活动总结格式
2014/08/29 职场文书
2014年外联部工作总结
2014/11/17 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python