浅析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 相关文章推荐
输出控制类
Oct 09 PHP
PHP源代码数组统计count分析
Aug 02 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
php中pcntl_fork详解
Apr 01 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错误提示的关闭方法详解
2013/06/23 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
php短址转换实现方法
2015/02/25 PHP
php之可变函数的实例详解
2017/09/13 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
回顾Javascript React基础
2019/06/15 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python常用算法学习基础教程
2017/04/13 Python
Python异常的检测和处理方法
2018/10/26 Python
python实现淘宝秒杀脚本
2020/06/23 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
小学国旗下的演讲稿
2014/08/28 职场文书
小学感恩主题班会
2015/08/12 职场文书
2016特色励志班级口号
2015/12/24 职场文书
Python实现简繁体转换
2021/06/07 Python