PHP 获取中英文混合字符串长度

通常情况下要想掌握一个字符串变量的长度[一般掌握其字数],自然想到 strlen

|——

$str = 'string';
echo strlen($str); //6

|——

$str = "方言";
echo strlen($str);//6

问题来了,明明是两个字的怎么会得到6的结果:在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。

[我们不需要掌握字节数,没有意义,只要掌握字数就行]

|——

$str = '你好,世界!';
echo strlen($str);    // GBK或GB2312下输出12,UTF-8下输出18

Wordpress 的代码可以借鉴

|——

$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]);    // 输出9

思路是用正则将字符串切割成单个字符,直接获取匹配到的结果,得到结果。

但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍。

|——

$tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
    $str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);

这样可以做到utf-8 和gbk环境下的兼容,但是一般日常我们都是掌握编码环境的[utf-8];

这样我们获取字符变量的字数就用:

|——

int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] );

参考:

http://www.clanfei.com/2012/12/1671.html