我怎样才能在php中使用strlen for Persian?

时间:2014-09-01 06:29:21

标签: php strlen multibyte persian

我有这段代码:

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

由于$string 3 波斯字符,输出必须 3 ,但我得 6

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

如何在php中使用strlen()来获得具有实际输出的波斯语?

5 个答案:

答案 0 :(得分:14)

使用 mb_strlen

  

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

由于您的3个字符都是多字节的,因此strlen会返回6个字符,但会按预期返回3

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

<强> Fiddle

注意

重要的是不要低估这种方法和任何类似替代方案的力量。例如,如果字符是多字节,则可以倾向于说好,然后只用strlen得到长度并将其除以2,但这只有在字符串的所有字符都是多字节甚至是句点.将使计数无效。例如这个

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

返回正确的4。所以这个函数不仅取整个长度除以2,每个多字节字符计数1,每个单字节字符计1个。

<强>注2:

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

答案 1 :(得分:7)

试试这个:

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

它适用于任何php版本。

答案 2 :(得分:5)

mb_strlen功能是你的朋友

答案 3 :(得分:4)

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

答案 4 :(得分:0)

从PHP5开始,可以使用iconv_strlen()(如php.net中所述,它返回字符串的字符数,因此它可能是最佳选择):

iconv_strlen("علی");
// 3

根据chernyshevsky@hotmail.com的this answer,你可以试试这个:

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倍(正如我测试的那样)!

注意:添加回声&#39;每个语句输出它们! ;)