2016-11-13 55 views
0

我有一個字符串,我想訪問ä字符。但它會輸出問號而不是正確的字符。使用方括號的字符串訪問字符不能正確輸出

這是我的代碼。

$array = array('ä', 'b', 'c'); 
$string = 'äbc'; 
echo $string; // äbc 
echo '<br />'; 
echo $string[0]; // ? 
echo '<br />'; 
echo $array[0]; // ä 

DEMO

誰能告訴我爲什麼?

修訂

echo strlen($string); // returns 4 
echo mb_substr($string, 0, 1); // ä 
+0

我認爲它做的字符編碼,如果用替換''了'它x'按預期工作。 – Celeritas

+0

@Celeritas'$ array [0]'返回正確的值。 –

+1

這實際上是這個問題的重複,雖然很難告訴http://stackoverflow.com/questions/13508937/get-first-character-of-utf-8-string – Celeritas

回答

4

根據您的字符集,字母A是一個多字節的信。當你使用數組訪問訪問一個字符串時,它返回第一個字節。如果是多字節,則返回一個不可打印的控制字符。

使用array-access訪問數組返回第一個元素,不管它的長度如何,在這種情況下是多字節ä。

1

您需要使用mb_substr()像這樣

$array = array('ä', 'b', 'c'); 
$string = 'äbc'; 
echo $string; // äbc 
echo '<br />'; 
echo mb_substr($string, 0, 1, 'UTF8'); // replace UTF8 with whatever charset you are using 
echo '<br />'; 
echo $array[0]; // ä 

DEMO

的原因是因爲PHP假定字符需要一個字節。但是在你使用ä的情況下情況並非如此,所以你需要使用mb_substr()而不是索引或substr()。

我強烈建議你閱讀這個問題的答案Get first character of UTF-8 string