有简单的方法从PHP中的多字节字符串中获取字符?

时间:2012-04-28 05:05:42

标签: php string encoding multibyte

这是我的问题:我的语言(葡萄牙语)使用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
o
r
a
ç
ã
o

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

3 个答案:

答案 0 :(得分:4)

  

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

答案 1 :(得分:1)

尝试:

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

答案 2 :(得分:0)

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