【问题标题】:There are simple way to get a character from multibyte string in PHP?有简单的方法从 PHP 中的多字节字符串中获取字符吗?
【发布时间】:2012-04-28 05:05:41
【问题描述】:

这是我的问题:我的语言(葡萄牙语)使用 ISO-8859-1 字符编码!当我想从像 'coração' (heart) 这样的字符串中访问一个字符时,我使用:

mb_internal_encoding('ISO-8859-1');
$str = "coração";

$len = mb_strlen($str,'UTF-8');

for($i=0;$i<$len;++$i)
    echo mb_substr($str, $i, 1, 'UTF-8')."<br/>";

这会产生:

C ○ r 一种 C 一种 ○

这很好用......但我的问题是,如果使用 mb_substr 函数不如简单的字符串正常访问快!但我想要一种简单的方法来做到这一点....就像在正常的字符串字符访问中一样: echo $str[$pos].... 有可能吗?

【问题讨论】:

    标签: php string encoding multibyte


    【解决方案1】:

    mb_substr 函数不像普通字符串字符访问中的 [...] 那样快:echo $str[$pos]...。有可能吗?

    没有。

    多字节函数必须检查每个字符以确定它占用多少字节(UTF-8 中为 1 到 4)。在那里,您立即有了字符索引 ($a[n]) 不起作用的原因:在阅读所有内容之前,您不知道需要什么字节才能获取第 n 个字符之前的字符。

    为了加快速度,您可以在此处查看答案:How to iterate UTF-8 string in PHP?

    但是,由于您使用 ISO 8859-1 或 Latin-1,您根本不必使用 mb_ 函数,因为在该编码中所有字符都是 encoded in one byte

    【讨论】:

    • 赞成。基本上提供的链接上的两个答案,this onemy answer 如果您将 mbstring.func_overload 设置为 7,就是您想要的。如果可用,他们基本上会进行索引,并且仅在必要时使用慢速 mb_substr。在 OP 的示例中,它只需要一次 mb_substr。
    • 感谢您提供有用的链接和解释。 5 年后,仍然是最相关的答案。
    【解决方案2】:

    试试:

    preg_match_all( "/./u", $str, $ar_chars );
    print_r( $ar_chars ); 
    

    【讨论】:

      【解决方案3】:

      ... 有点像。如果您使用固定宽度编码(BMP 中的 ISO 8859-*、UCS-2 或 UTF-32 或 UTF-16),那么您可以使用固定乘数进行字符访问。不过,您仍然需要对多字节编码进行多次访问。

      【讨论】:

      • 嗯...但是我的问题是关于进行这些访问的有效方法。我测试了一个普通的字符串连接循环($new_str .= $old_str[2] - 仅用于测试...)并使用 mb_substr ($new_str .= mb_substr($old_str, 2, 1, 'UTF-8') 和我得到了这个(循环 50 000 次迭代):正常访问 0.016 秒,而 mb_substr 函数需要 4.9802091121674 秒!这是一个很大的性能问题!
      • 使用固定宽度编码,您可以使用固定乘数。
      • 那我该怎么做呢?给我一个例子!
      • substr($ucs2string, $pos * 2, 2)
      • 嗯...但是关于性能问题(就像我在测试中显示的那样,我意识到 [上面])?
      猜你喜欢
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多