【问题标题】:How can I use strlen in php for Persian?如何在 php 中为波斯语使用 strlen?
【发布时间】:2014-10-25 08:05:11
【问题描述】:

我有这个代码:

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

由于 $string3 个波斯字符,输出必须是 3 但我得到 6

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

如何在 php 中使用 strlen() 来获得真正的输出?

【问题讨论】:

  • 使用 mb_strlen()(来自 MBString 扩展)。
  • 您的输出是 6,因为 strlen() 在不考虑编码的情况下计算字节数。在您的编码(可能是 UTF8)中,每个字符计为 2 个字节。因此,3 个字符的输出将是 = 6 (3 chars * 2 bytes)。
  • 我自己跑了var_dump(mb_strlen('علی'));,但输出还是6?

标签: php strlen multibyte persian


【解决方案1】:

使用mb_strlen

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

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

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

Fiddle

注意

重要的是不要低估这种方法和任何类似替代方法的威力。例如,如果字符是多字节的,可能会倾向于说好的,然后只需使用 strlen 获取长度并将其除以 2 但这只有在字符串的所有字符都是多字节甚至是句点 @ 时才有效987654328@ 将使计数无效。比如这个

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

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

注意2:

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

【讨论】:

  • 这仍然会输出3,你需要像@Rox提到的那样传递encoding参数
【解决方案2】:

试试这个:

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

它适用于任何 php 版本。

【讨论】:

    【解决方案3】:

    mb_strlen 函数是你的朋友

    【讨论】:

      【解决方案4】:
      $string = 'علی';
      echo mb_strlen($string, 'utf8');
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 2016-11-25
          • 1970-01-01
          • 2018-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多