浅析PHP中strlen和mb_strlen的区别


Posted in PHP onAugust 31, 2014

在PHP中,strlen与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核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

PHP 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
PHP正则表达式笔记与实例详解
May 09 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 #PHP
PHP实现数组递归转义的方法
Aug 28 #PHP
PHP之autoload运行机制实例分析
Aug 28 #PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 #PHP
PHP反射机制用法实例
Aug 28 #PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 #PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 #PHP
You might like
PHP+DBM的同学录程序(4)
2006/10/09 PHP
php画图实例
2014/11/05 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
php intval函数用法总结
2019/04/14 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
python实现淘宝秒杀脚本
2020/06/23 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
django 取消csrf限制的实例
2020/03/13 Python
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
中专毕业生自荐信
2013/11/16 职场文书
生日宴会答谢词
2014/01/09 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
婚内分居协议书范文
2014/11/26 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL