我有这段代码:
$string = 'علی';
echo strlen($string);
由于字符串$string
有3个波斯字符,输出应该是3,但我得到了6。
علی
有3个字符。为什么我的输出是6?
我怎样在php中使用strlen()
来获得波斯语的真实输出?
使用 mb_strlen
返回字符编码(第二个参数)为 encoding 的字符串 str 中的字符数。一个多字节字符计为 1。
由于您的 3 个字符都是多字节字符,在使用 strlen
返回值为 6,但使用 mb_strlen
可以得到预期的结果 3。
echo mb_strlen($string,'utf-8');
注意
不要低估这种方法及其类似替代方案的威力。例如,你可能会倾向于说:如果字符是多字节的,那么就用 strlen
获取长度并将其除以2,但这仅在字符串的所有字符都是多字节时才有效,即使一个句号 .
也会使计数失效。例如:
echo mb_strlen('علی.','utf-8');
返回4
,这是正确的。因此,该函数不仅将整个长度除以2,还会对每个多字节字符计算1,并对每个单字节字符计算1。
Note2:
看起来你决定不使用此方法,因为旧的PHP版本默认情况下未启用mbstring
扩展,并且你可能已经决定不尝试启用它:) 但对于未来的读者来说,启用它并不困难,而且如果你正在处理多字节字符,则建议启用它,因为你可能需要处理的不仅仅是长度。 查看手册
试试这个:
function ustrlen($text)
{
if(function_exists('mb_strlen'))
return mb_strlen( $text , 'utf-8' );
return count(preg_split('//u', $text)) - 2;
}
这将适用于任何PHP版本。
mb_strlen
函数是你的好帮手。
$string = 'علی';
echo mb_strlen($string, 'utf8');
从PHP5开始,可以使用iconv_strlen()
(如php.net所述,它返回字符串的字符数,因此可能是最好的选择):
iconv_strlen("علی");
// 3
基于 chernyshevsky@hotmail.com 的 这个答案,你可以尝试这样做:
function string_length (string $string) : int {
return strlen(utf8_decode($string));
}
string_length("علی");
// 3
mb_strlen()
:mb_strlen("علی");
// 3
它们之间(对于非法的拉丁字符)几乎没有什么区别:
iconv_strlen("a\xCC\r"); // A notice
string_length("a\xCC\r"); // 3
mb_strlen("a\xCC\r"); // 2
性能: mb_strlen()
是最快的。总体而言,iconv_strlen()
和 string_length()
在性能上没有区别。但令人惊讶的是,mb_strlen()
比两者都快约9倍(根据我的测试)!
mb_strlen()
函数(来自MBString扩展)。 - BlitZstrlen()
在计算字节数时没有考虑编码。在你的编码(可能是UTF8)中,每个字符计为2个字节。因此,3个字符的输出将为= 6(3 chars * 2 bytes
)。 - BlitZvar_dump(mb_strlen('علی'));
,但输出仍然是6? - bhargavg