PHP中strlen()和mb_strlen()的区别浅析


Posted in PHP onJune 19, 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:

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页面防重复提交方法总结
Nov 25 PHP
PHPAnalysis中文分词类详解
Jun 13 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
为你总结一些php信息函数
Oct 21 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
php微信开发接入
Aug 27 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
thinkPHP中_initialize方法实例分析
Dec 05 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
Yii框架组件的事件机制原理与用法分析
Apr 07 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 #PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 #PHP
PHP base64编码后解码乱码的解决办法
Jun 19 #PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 #PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 #PHP
ThinkPHP CURD方法之field方法详解
Jun 18 #PHP
You might like
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
分享一个超好用的php header下载函数
2014/01/31 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
Node对CommonJS的模块规范
2019/11/06 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
费用会计岗位职责
2014/01/01 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
redis数据一致性的实现示例
2022/03/18 Redis