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") ] );
参考: