Получить первый символ строки UTF-8
Я получаю строку UTF-8 из db и пытаюсь повторить ее первый символ:
$title= $model- > title;
echo $title [0];
Я получаю:
Что случилось?
Спасибо!
Ответы
Ответ 1
Есть несколько вещей, которые нужно учитывать:
- Убедитесь, что данные в БД хранятся как UTF-8
- Убедитесь, что клиентское соединение с БД находится в UTF-8 (например, в MySQL см.: http://www.php.net/manual/en/mysqli.character-set-name.php)
- Убедитесь, что для страницы задан тип контента UTF-8 [вы можете использовать
header('Content-Type: utf-8');
]
- Попробуйте установить внутреннюю кодировку, используя
mb_internal_encoding("UTF-8");
- Используйте
mb_substr
вместо обозначения индекса массива
Ответ 2
$first_char = mb_substr($title, 0, 1);
Для правильной обработки строк Unicode вам необходимо использовать многобайтовые строковые функции PHP:
http://www.php.net/manual/en/ref.mbstring.php
http://www.php.net/manual/en/function.mb-substr.php
Вам также нужно указать кодировку символов в <head>
вашего HTML:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
или
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16" />
Ответ 3
Как уже упоминалось в других вопросах, с PHP, при попытке получить подстроку, он не понимает многобайтовых символов (например, с UTF8).
В других ответах не упоминается, что вы должны намекать на кодировку, которую вы хотели бы использовать для mb_substr
Так, например, я использую это:
mb_substr( "Sunday", 0, 1,'UTF8'); // Returns S
mb_substr( "воскресенье", 0, 1,'UTF8'); // Returns в
Ответ 4
Строки PHP не понимают многобайтовые строки по умолчанию, такой массив, как индексирование, будет прерывать первый байт, и если это произойдет не в диапазоне ascii, вы получите этот результат.
Используйте mb_substr.