如何在php中使用strlen函数来处理波斯语?

10

我有这段代码:

$string = 'علی';
echo strlen($string);

由于字符串$string3个波斯字符,输出应该是3,但我得到了6

علی有3个字符。为什么我的输出是6

我怎样在php中使用strlen()来获得波斯语的真实输出?


3
请使用mb_strlen()函数(来自MBString扩展)。 - BlitZ
2
你的输出是6,因为strlen()在计算字节数时没有考虑编码。在你的编码(可能是UTF8)中,每个字符计为2个字节。因此,3个字符的输出将为= 6(3 chars * 2 bytes)。 - BlitZ
1
我自己运行了 var_dump(mb_strlen('علی'));,但输出仍然是6? - bhargavg
5个回答

20

使用 mb_strlen

返回字符编码(第二个参数)为 encoding 的字符串 str 中的字符数。一个多字节字符计为 1。

由于您的 3 个字符都是多字节字符,在使用 strlen 返回值为 6,但使用 mb_strlen 可以得到预期的结果 3。

echo mb_strlen($string,'utf-8');

Fiddle

注意

不要低估这种方法及其类似替代方案的威力。例如,你可能会倾向于说:如果字符是多字节的,那么就用 strlen 获取长度并将其除以2,但这仅在字符串的所有字符都是多字节时才有效,即使一个句号 . 也会使计数失效。例如:

echo mb_strlen('علی.','utf-8');

返回4,这是正确的。因此,该函数不仅将整个长度除以2,还会对每个多字节字符计算1,并对每个单字节字符计算1。

Note2:

看起来你决定不使用此方法,因为旧的PHP版本默认情况下未启用mbstring扩展,并且你可能已经决定不尝试启用它:) 但对于未来的读者来说,启用它并不困难,而且如果你正在处理多字节字符,则建议启用它,因为你可能需要处理的不仅仅是长度。 查看手册


这仍将输出“3”,你需要像@Rox提到的那样传递“encoding”参数。 - bhargavg

9

试试这个:

function ustrlen($text)
{
    if(function_exists('mb_strlen'))
        return mb_strlen( $text , 'utf-8' );
    return count(preg_split('//u', $text)) - 2;
}

这将适用于任何PHP版本。


5

mb_strlen函数是你的好帮手。


4
$string = 'علی';
echo mb_strlen($string, 'utf8');

0

从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倍(根据我的测试)!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接