细说PHP中strlen和mb_strlen的区别

开发 后端
在php中常见的计算字符串长度的函数有:strlen和mb_strlen.当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。

PHP中,strlenmb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别。
下面通过例子,讲解这两者之间的区别。

先看例子:

  1. <?php  
  2. //测试时文件的编码方式要是UTF8  
  3. $str='中文a字1符';  
  4. echo strlen($str).'<br>';//14  
  5. echo mb_strlen($str,'utf8').'<br>';//6  
  6. echo mb_strlen($str,'gbk').'<br>';//8  
  7. echo mb_strlen($str,'gb2312').'<br>';//10  
  8. ?> 

 

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .

利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)

 

  1. echo (strlen($str) + mb_strlen($str,'UTF8')) / 2; 

 

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

 

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

【编辑推荐】

  1. 五个常见 PHP数据库问题
  2. 2011中国PHP技术高峰论坛精彩看点
  3. PHP正则表达式 PHP中的正则函数
  4. 高手传经 学习PHP重在坚持
  5. PHP中几个常用的时间应用方式
责任编辑:于铁 来源: 大学生校园网
相关推荐

2024-04-09 08:57:25

SizeofC++字符串

2024-06-17 10:45:07

C++编程操作符

2024-04-10 13:45:07

C++编程

2011-05-19 13:45:15

PHP单引号双引号

2009-11-25 11:42:34

PHP判断数组为空

2010-08-03 15:02:45

FlexPHP

2009-12-01 14:46:16

PHP mb_subs

2009-09-24 10:06:55

PHP include

2009-11-27 10:02:54

PHP mb_strw

2009-11-27 09:30:58

PHP函数mb_str

2009-11-26 16:26:32

PHP字符串mbstr

2019-03-08 08:55:16

PHP7PHP5web安全

2022-01-19 09:00:00

Java空指针开发

2009-09-28 11:25:17

PersistentQKestrelScala

2014-08-18 09:31:15

2019-01-17 08:38:03

Redis监控内存

2023-10-12 08:25:18

Javaequals内存

2021-08-04 08:33:59

TypeScriptConst Readonly

2017-08-16 13:30:05

Java深拷贝浅拷贝

2015-08-10 10:58:53

dompropertyattribute
点赞
收藏

51CTO技术栈公众号