2012-04-28 69 views
5

这是我的问题:我的语言(葡萄牙语)使用ISO-8859-1字符编码!当我想从像“科拉桑”(心脏),我用一个字符串访问字符:有很简单的方法来从PHP中的多字节字符串中获取一个字符?

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] ....这是可能的吗?

回答

0

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

+0

嗯...但我的问题是关于一个有效的方式做这些访问。我测试了一个正常的字符串连接循环($ new_str。= $ old_str [2] - 仅用于测试...)和使用mb_substr($ new_str。= mb_substr($ old_str,2,1,'UTF-8')和I (循环50 000次迭代):0.016 s到4.9802091121674 s到mb_substr函数的正常访问!这是一个很大的性能问题! – 2012-04-28 05:20:43

+0

使用固定宽度的编码,你可以使用一个固定的乘法器 – 2012-04-28 05:21:53

+0

我该怎么做呢?给我举一个例子! – 2012-04-28 05:22:52

4

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

多字节功能必须检查每一个字符,以确定有多少个字节(在UTF-8 1至4)占据。在这里,你立刻就有了为什么字符索引($a[n])不起作用的原因:在读取所有字符之前,你不知道需要什么字节才能得到第012个字符。

为了加快了一点东西,你可以看看这里的答案:How to iterate UTF-8 string in PHP?

然而,由于您使用ISO 8859-1或Latin-1的,你不必在所有使用mb_功能,因为在该编码中所有字符都是encoded in one byte

+0

Upvoted。如果您有mbstring,请在提供的链接上提供答案,[this one](http://stackoverflow.com/a/14366023/793036)和[我的答案](http://stackoverflow.com/a/17156392/793036)。 func_overload设置为7,是你想要的。他们基本上做索引,如果它可用并使用慢速mb_subs只有在必要时才转。在OP的例子中,它只需要mb_substr一次。 – Andrew 2013-06-17 20:49:43

+0

感谢您提供有用的链接和解释。 5年后,仍然是最相关的答案。 – Valdrinit 2017-06-29 16:46:06

1

尝试:

preg_match_all("/./u", $str, $ar_chars); 
print_r($ar_chars); 
相关问题