浅析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 相关文章推荐
用libtemplate实现静态网页生成
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
php 正则 过滤html 的超链接
Jun 02 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 PHP
跟我学Laravel之快速入门
Oct 15 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
php intval函数用法总结
Apr 14 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
ECMAScript 基础知识
2007/06/29 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python unittest模块用法实例分析
2018/05/25 Python
浅析Python四种数据类型
2018/09/26 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Pygame的程序开始示例代码
2020/05/07 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
客服文员岗位职责
2013/11/29 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
安全标准化实施方案
2014/02/20 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
广告业务员岗位职责
2015/02/13 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python