本文目录一览:
PHP字符串长度计算 - strlen()函数使用介绍
strlen()
函数和mb_strlen()
函数
在PHP中,函数strlen()
返回字符串的长度。函数原型如下:
int strlen(string string_input);
参数string_input
为要处理的字符串。
strlen()
函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中文字符占两个字节,所以一个中文字符的长度是2。例如:
echo strlen("");
echo strlen("三知开发网");
“echo strlen("");
”的运行结果:15
“echo strlen("三知开发网");
”的运行结果:15
这里有一个疑问,一个中文字符不是占2个字节吗?“三知开发网”,明明是五个汉字,运行的结果怎么会是15?
原因出在这里:strlen()
计算时,对于一个UTF-8的中文字符,会把它当做长度为3来处理。当出现中英文混排的情况下,怎么准确的计算字符串的长度呢?这里,得引入另外一个函数mb_strlen()
。mb_strlen()
函数的用法与strlen()
几乎一摸一样,只是多了一个指定字符集编码的参数。函数原型为:
int mb_strlen(string string_input, string encode);
PHP内置的字符串长度函数strlen
无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen
得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。
因此,下面的代码能准确计算出中文字符串的长度:
$str = "三知sunchis开发网";
echo strlen($str)."<br>"; //结果:22
echo mb_strlen($str,"UTF8")."<br>"; //结果:12
$strlen = (strlen($str)+mb_strlen($str,"UTF8"))/2;
echo $strlen; //结果:17
原理分析:
strlen()
计算时,对待UTF-8的中文字符长度是3,所以“三知sunchis开发网”的长度为5×3+7×1=22
在mb_strlen
计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“三知sunchis开发网”长度为5×1+7×1=12
剩下的就是纯数学问题了,在此就不啰嗦了……
注意:对于mb_strlen($str,'UTF-8')
,如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()
函数得到。需要注意的是,mb_strlen
并不是PHP核心函数,使用前需要确保在php.ini
中加载了php_mbstring.dll
,即确保“extension=php_mbstring.dll
”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。
PHP获取中英混合字符串长度的方法
今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen
函数。
$str = 'Hello world!';
echo strlen($str); // 输出12
然而在PHP自带的函数中,strlen
及mb_strlen
都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。
$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18
而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:
$name = '张耕畅';
$len = strlen($name); // 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len = 3 && $len = 8){
echo 'TRUE';
}else{
echo 'FALSE';
}
那么有什么方便而实用的方法可以获得含中文字符串的长度呢?可以用正则计算出中文字符的个数,在GBK/GB2312下除以2,UTF-8编码下则除以3,最后再加上非中文字符串的长度,但这样未免太过麻烦。 WordPress这么一段代码,借鉴如下:
$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]); // 输出9
思想是用正则表达式将字符串分割成单个字符,并直接用count
计算出匹配到的字符数,便是我们想要的结果了。
但以上代码在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]);
可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。 以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:
int iconv_strlen (
string $str
[, string $charset = ini_get("iconv.internal_encoding") ]
)
PHP 中如何获得中英文混合字符串长度
$str='中文a字1符';
echo strlen($str);
echo '<br />';
echo mb_strlen($str,'UTF8');
利用PHP函数计算中英文字符串长度的方法
本文实例讲述了利用PHP函数计算中英文字符串长度的方法。分享给大家供大家参考。具体实现方法如下:
一般来说大家知道英文字符占一个字节,而中文字符在GBK下占两个字符,在UTF-8下占三个字符。很多人印象中PHP计算字符串长度就是strlen()
函数,其实不然,它计算的是字节的长度而非字符的长度。那么如何获取一个字符串中字符的长度呢?还有mb_strlen()
。
具体代码如下:
echo $str = 'PHP点点通';
echo strlen($str); // 3*1 + 3*3 = 12
echo mb_strlen($str, 'gb2312'); // 3*1 + 3*2 = 9
echo mb_strlen($str, 'utf-8'); // 6