详解PHP中strlen和mb_strlen函数的区别


Posted in PHP onMarch 07, 2014

在PHP里有两个计算字符串个数的函数
一个是 strlen,一个是mb_strlen;
先来看看手册中的定义
strlen
strlen — 获取字符串长度
int strlen ( string $string )
返回给定的字符串 string 的长度。

mb_strlen
int mb_strlen ( string $str [, string $encoding ] )
返回给定的字符串 string 的长度。
encoding参数为字符编码。如果省略,则使用内部字符编码。

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

PHP 相关文章推荐
PHP脚本的10个技巧(8)
Oct 09 PHP
如何将数据从文本导入到mysql
Oct 09 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
PHP动态生成javascript文件的2个例子
Apr 11 PHP
ThinkPHP Mobile使用方法简明教程
Jun 18 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 #PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 #PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 #PHP
体育彩票排列三组选三算法分享
Mar 07 #PHP
PHP错误和异长常处理总结
Mar 06 #PHP
php发送post请求函数分享
Mar 06 #PHP
PHP empty函数报错解决办法
Mar 06 #PHP
You might like
php提示undefined index的几种解决方法
2012/05/21 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP实现小偷程序实例
2016/10/31 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
Python3基础之list列表实例解析
2014/08/13 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
庆中秋节主题活动方案
2014/02/03 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
项目经理任命书内容
2014/06/06 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
使用Redis做预定库存缓存功能
2022/04/02 Redis