当在处理字符时,如果字节小于0x80,则把它当作单字节来处理,否则会继续读取下一个字节,这通常跟编码有关,GBK会将2个字节当成一个字符来处理,UTF8则需要3个字节。有时候在PHP中需要做类似的处理,比如计算字符串中字符的个数(字符串可能包含单字节和多字节),strlen方法只能计算字节数,而mb_strlen需要开启扩展。类似这样的需求,其实很容易处理:
function mbstrlen($str)
{
$len = strlen($str);
if ($len <= 0)
{
return 0;
}
$count = 0;
for ($i = 0; $i < $len; $i++)
{
$count++;
if (ord($str{$i}) >= 0x80)
{
$i += 2;
}
}
return $count;
}
echo "output: " . mbstrlen("中国so强大!") . "\n";
?>
以上代码的实现就是利用单字节字符的ASCII码小于0x80。至于要跳过几个字节,这要看具体是什么编码.
参考资料:
PHP: 深入pack/unpack
https://my.oschina.net/goal/blog/195749