5

这是我的问题:我的语言(葡萄牙语)使用 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/>";

这会产生:

C
○
r
一个
C
一个
○

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

4

3 回答 3

4

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

不。

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

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

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

于 2012-05-02T11:24:05.510 回答
1

尝试:

preg_match_all( "/./u", $str, $ar_chars );
print_r( $ar_chars ); 
于 2012-05-02T11:34:18.627 回答
0

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

于 2012-04-28T05:10:40.130 回答