2016-11-13 2 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

В зависимости от вашей кодировки, письмо является многобайтным письмом. Когда вы получаете доступ к строке с использованием доступа к массиву, он возвращает первый байт. В случае многобайтового возврата возвращается непечатаемый управляющий символ.

Доступ к массиву с использованием доступа к массиву возвращает первый элемент, независимо от его длины, в этом случае многобайтовый ä.

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

Смежные вопросы