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(windows版本)中的COM函数
Oct 09 PHP
PHP 高手之路(三)
Oct 09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
php session安全问题分析
Jun 24 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 PHP
PHP sdk文档处理常用代码示例解析
Dec 09 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+memcache实现消息队列案例分享
2014/05/21 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
php格式文件打开的四种方法
2018/02/24 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
javascript之更有效率的字符串替换
2008/08/02 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
JS中常用的消息框总结
2018/02/24 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
新闻专业毕业生英文求职信
2014/03/19 职场文书
公司投资建议书
2014/05/16 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
新娘婚礼致辞
2015/07/27 职场文书
七年级作文之秋游
2019/10/21 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
Python使用Kubernetes API访问集群
2021/05/30 Python