PHP字符串长度计算 - strlen()函数使用介绍


Posted in PHP onOctober 15, 2013

strlen()函数和mb_strlen()函数

在PHP中,函数strlen()返回字符串的长度。函数原型如下:

int strlen(string string_input);

参数string_input为要处理的字符串。

strlen()函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中午字符占两个字节,所以一个中午字符的长度是2。例如

<?php 
echo strlen("www.sunchis.com"); 
echo strlen("三知开发网"); 
?>

“echo strlen("www.sunchis.com");”的运行结果:15

“echo strlen("三知开发网");”的运行结果:15

这里有一个疑问,一个中文字符不是占2个字节吗?“三知开发网”,明明是五个汉字,运行的结果怎么会是15?

原因出在这里:strlen()计算时,对于一个UTF-8的中文字符,会把它当做长度为3来处理。当出现中英文混排的情况下,怎么准确的计算字符串的长度呢?这里,得引入另外一个函数mb_strlen()。mb_strlen()函数的用法与strlen()几乎一摸一样,只是多了一个指定字符集编码的参数。函数原型为:

int mb_strlen(string string_input, string encode);

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。 因此,下面的代码能准确计算出中文字符串的长度:
<?php 
$str = "三知sunchis开发网"; 
echo strlen($str)."<br>"; //结果:22 
echo mb_strlen($str,"UTF8")."<br>"; //结果:12 
$strlen = (strlen($str)+mb_strlen($str,"UTF8"))/2; 
echo $strlen; //结果:17 
?>

原理分析:

strlen()计算时,对待UTF-8的中文字符长度是3,所以“三知sunchis开发网”的长度为5×3+7×1=22
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“三知sunchis开发网”长度为5×1+7×1=12

剩下的就是纯数学问题了,在此就不??铝恕?

注意:对于mb_strlen($str,'UTF-8'),如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。

PHP 相关文章推荐
PHP性能优化 产生高度优化代码
Jul 22 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
浅析PHP绘图技术
Jul 03 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
ThinkPHP3.2.2的插件控制器功能简述
Jul 09 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
PHP SOCKET编程详解
May 22 PHP
php验证手机号码
Nov 11 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
php后台如何避免用户直接进入方法实例
Oct 15 #PHP
php下拉选项的批量操作的实现代码
Oct 14 #PHP
php登陆页的密码处理方式分享
Oct 14 #PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 #PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 #PHP
php检测网页是否被百度收录的函数代码
Oct 09 #PHP
php MessagePack介绍
Oct 06 #PHP
You might like
小议javascript 设计模式 推荐
2009/10/28 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Flask之flask-session的具体使用
2018/07/26 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
python在地图上画比例的实例详解
2020/11/13 Python
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
创建文明学校实施方案
2014/03/11 职场文书
白血病募捐倡议书
2014/05/14 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
专业见习报告范文
2014/11/03 职场文书
婚庆答谢词
2015/01/04 职场文书
合同审查法律意见书
2015/06/04 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL