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 相关文章推荐
使用 php4 加速 web 传输
Oct 09 PHP
php调用mysql存储过程
Feb 14 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
php中file_get_contents()函数用法实例
Feb 21 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 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
PHP中用hash实现的数组
2011/07/17 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
js window.event对象详尽解析
2009/02/17 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
JavaScript File分段上传
2016/03/10 Javascript
js css自定义分页效果
2017/02/24 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
Python多线程学习资料
2012/12/19 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Hadoop中的Python框架的使用指南
2015/04/22 Python
浅析Python多线程下的变量问题
2015/04/28 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
应届护士求职信范文
2014/01/26 职场文书
应届生找工作求职信
2014/06/24 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
生活小常识广播稿
2014/09/16 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python