在 PHP 中,有一些简单的方法可以从多字节字符串中获取字符


There are simple way to get a character from multibyte string in PHP?

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

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/>";

这会产生:

cor一个ção

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

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

不。

  • 每个软件开发人员绝对、肯定地必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!
  • 过早优化

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

为了加快速度,你可以看看这里的答案:如何在 PHP 中迭代 UTF-8 字符串?

但是,由于您使用ISO 8859-1或Latin-1,因此根本不需要使用mb_函数,因为在编码中,所有字符都编码在一个字节中。

尝试:

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

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