2012-04-28 64 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); 
相關問題