php里面判断字符个数

官方手册上说了,可以用strlenmb_strlen来计算字符串长度

这两个有点区别,比如说看下面的示例代码:

<?php

$strEn = 'abcd';
$strZh = '测试';

print_r(strlen($strEn). "\n");
print_r(strlen($strZh). "\n");

print_r(mb_strlen($strEn, 'UTF8') . "\n");
print_r(mb_strlen($strZh, 'UTF8') . "\n");

?>

打印出来是这样的

4
6
4
2 

strlen是得到的是字符串所占的字节数,而不是字符的个数。

在UTF-8编码情况下,英文和数字占一个字节,一般情况下中文占3个字节。

要使用mb_strlen需要php里面已经安装了插件mbstring


2018-12-09 补充:

如果mb_strlen后面不指定编码方式,那么默认会使用php.ini配置文件里面的mbstring.internal_encoding定义的编码方式。

看下php.ini配置文件关于mbstring.internal_encoding的注释:

mbstring.internal_encoding注释图片

上面说,如果mbstring.internal_encoding为空,那么mbstring首选的编码方式是iconv.internal_encoding,其次是全局的internal_encoding,再其次是default_charset。如果mbstring.internal_encoding不为空,mbstring就直接使用mbstring.internal_encoding这里面定义的编码方式。

看下面的代码:

<?php

$strEn = 'abcd';
$strZh = '测试';

print_r("strlen:\n");
print_r(strlen($strEn). "\n");
print_r(strlen($strZh). "\n");

print_r("mb_strlen UTF8:\n");
print_r(mb_strlen($strEn, 'UTF8') . "\n");
print_r(mb_strlen($strZh, 'UTF8') . "\n");

print_r("mb_strlen:\n");
print_r(mb_strlen($strEn) . "\n");
print_r(mb_strlen($strZh) . "\n");

?>

打印出来是:

strlen:
4
6
mb_strlen UTF8:
4
2 
mb_strlen:
4
6

从打印结果里面看,mb_strlen($strZh)mb_strlen($strZh, 'UTF8')的结果不一样。我就去php.ini里面查了一下mbstring.internal_encodingdefault_charset,结果iconv.internal_encoding是空、mbstring.internal_encoding是空、全局的internal_encoding也是空,default_charset设置的是ISO-8559-1

可以使用命令php -r 'echo mb_internal_encoding();'在终端执行一下,看看你的环境mbstring使用的编码方式。

有时候使用mb_strlen会出现在两台服务器上结果不一样的情况,这个时候就要看一下是否是php.ini里面的配置不一样。为了避免这种问题,还是建议在使用mbstring相关方法的时候,指定编码方式。


2018-12-10 补充:

有时候会看到一些需求,比如说最长100个字符,中文占两个字符,这里就不能用上面mb_strlen($str, 'UTF8')的方法来判断字符串长度,因为它是把中文当做一个字符来看。

这时候就可以使用mb_strwidth,它判断的是字符宽度。看下官方手册对多字节字符宽度的描述

官方手册对多字节字符宽度的描述

一般情况下,代码里面如果要用正则判断中文的话,范围是[\u4e00-\u9fa5],也有的是设置范围是u4e00~u9fff。不过mb_strwidth里面中文都是两个字符的。

看如下示例代码:

<?php

$strEn = 'abcd';
$strZh = '测试';

print_r("strlen:\n");
print_r(strlen($strEn). "\n");
print_r(strlen($strZh). "\n");

print_r("mb_strlen UTF8:\n");
print_r(mb_strlen($strEn, 'UTF8') . "\n");
print_r(mb_strlen($strZh, 'UTF8') . "\n");

print_r("mb_strlen:\n");
print_r(mb_strlen($strEn) . "\n");
print_r(mb_strlen($strZh) . "\n");

print_r("mb_strwidth:\n");
print_r(mb_strwidth($strEn) . "\n");
print_r(mb_strwidth($strZh) . "\n");

print_r("mb_strwidth UTF8:\n");
print_r(mb_strwidth($strEn, 'UTF8') . "\n");
print_r(mb_strwidth($strZh, 'UTF8') . "\n");

?>

打印出来是:

strlen:
4
6
mb_strlen UTF8:
4
2 
mb_strlen:
4
6
mb_strwidth:
4
6
mb_strwidth UTF8:
4
4

上面解释过,我的php.ini里面设置的mbstring.internal_encoding是空,且iconv.internal_encoding、全局internal_encoding都是空的,default_charset设置的是ISO-8559-1,所以会出现mb_strwidth($strZh)mb_strwidth($strZh, 'UTF8')结果不一致的情况。