详解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 相关文章推荐
java EJB 加密与解密原理的一个例子
Jan 11 PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
PHP 获取远程文件内容的函数代码
Mar 24 PHP
php 输出双引号&quot;与单引号'的方法
May 09 PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php调整服务器时间的方法
Apr 03 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
实例分析10个PHP常见安全问题
Jul 09 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
深入解析php之sphinx
2013/05/15 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
js 自定义的联动下拉框
2010/02/07 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
jQuery的框架介绍
2016/05/11 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
python3爬虫之设计签名小程序
2018/06/19 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
中西医专业毕业生职业规划书
2014/02/24 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
六年级作文之关于梦
2019/10/22 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
MySQL三种方式实现递归查询
2022/04/18 MySQL
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers