浅析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 相关文章推荐
PHP安全编程之加密功能
Oct 09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
初次接触php抽象工厂模式(Elgg)
Mar 21 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
重新认识php array_merge函数
Aug 31 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
php post换行的方法
Feb 03 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实现mysql同步的实现方法
2009/10/21 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Python map和reduce函数用法示例
2015/02/26 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Python Series从0开始索引的方法
2018/11/06 Python
python中安装django模块的方法
2020/03/12 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
安全生产检查通报
2014/01/29 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
学校党支部承诺书
2015/04/30 职场文书
天那边观后感
2015/06/09 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
python实现自定义日志的具体方法
2021/05/28 Python