php里面判断字符个数
官方手册上说了,可以用strlen
和mb_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首选的编码方式是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_encoding
和default_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')
结果不一致的情况。