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的5个入手程序
Nov 23 PHP
模板引擎Smarty深入浅出介绍
Dec 06 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
php 常用算法和时间复杂度
Jul 01 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
PHP获取文本框、密码域、按钮的值实例代码
Apr 19 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
PHP实现的AES 128位加密算法示例
Sep 16 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
PHP的5个安全措施小结
2012/07/17 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
JS数学函数Exp使用说明
2012/08/09 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
详解vue v-model
2020/08/31 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python如何生成各种随机分布图
2018/08/27 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
华为慧通面试题
2012/09/11 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
学生手册家长评语
2014/02/10 职场文书
《中华少年》教学反思
2014/02/15 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
应急管理培训方案
2014/06/12 职场文书
护士实习求职信
2014/06/22 职场文书
医学生求职信
2014/07/01 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
公司规章制度范本
2015/08/03 职场文书
MySQL窗口函数的具体使用
2021/11/17 MySQL
MySQL派生表联表查询实战过程
2022/03/20 MySQL
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL