Статья переехала в мой гитхаб: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md . Ниже идет устаревшая и неточная версия.
Некоторые функции PHP (strlen
, substr
, а также обращение к строке как к массиву: $str[0]
) не работают с многобайтовыми кодировками (вроде utf-8). В utf-8 1 символ закодирован с помощью от 1 до 6 байтов, а эти функции думают, что 1 буква всегда кодируется одним байтом. По этой причине они ломают символы, в результате получаются битые символы и ничего не работает. Потому вместо них надо использовать mb_ функции например mb_strlen
, mb_substr
. Вместо доступа к строке как к массиву надо использовать mb_substr
.
Если тебе интересно, почему эти функции поддерживают только однобайтные кодировки, а не многобайтные, то причина в том, что они очень старые и написаны в то время (лет 40 назад) когда utf-8 и многобайтных кодировок еще не было.
Давай разберем пример. Допустим, у нас есть строка из русской буквы «щ» в кодирове utf-8. Попытаемся взять первую букву с п