2013-01-08 68 views
4

請看看這個:奇怪的字符串行爲

$str = '¡hola!'; // '¡' is the spanish opening exclamation mark 

echo $str{0}; // prints nothing 
echo $str{1}; // prints � 
echo $str{2}; // prints h 

PHP腳本有UTF-8編碼,我去執行它作爲Apache模塊或CLI相同的結果。 PHP版本:5.4.6

爲什麼我得到這個奇怪的結果?

+2

貌似¡是一個多字節字符..你爲什麼想通過訪問它' []'? –

+3

多字節字符串。 ''是兩個字節的字符[00A1],這就是爲什麼第一個字節沒有任何內容,第二個字節是垃圾。 – Sammitch

+3

@Peter這不是瀏覽器編碼問題,通過[]或{}索引字符串不是多字節安全的。 – dualed

回答

2

這是由於這樣的事實¡實際上是UTF多字節字符,其中PHP不通過數組訪問([0])妥善處理。你會想看看多字節函數來代替:http://php.net/manual/en/book.mbstring.php

這應該工作,你希望:

$str = '¡hola!'; 

echo mb_substr($str, 0, 1, 'UTF-8'); // prints ¡ 
echo mb_substr($str, 1, 1, 'UTF-8'); // prints h 
echo mb_substr($str, 2, 1, 'UTF-8'); // prints o 
4

通過[]{}索引字符串不是多字節安全的。

使用多字節的功能,而不是像mb_substr