UTF-8 использует несколько байтов для представления символов Unicode вне диапазона ASCII (от U + 00000 до U + 0007F). Ваша строка 如果
(U + 05982 U + 0679C) представлена шестью байтами:
0xE5 0xA6 0x82 0xE6 0x9E 0x9C
-------------- --------------
(U+05982) (U+0679C)
PHP изначально не поддерживает Unicode; он обрабатывает все строки как последовательность байтов, а не символов Юникода. Таким образом, $str[1]
извлекает второй байт (0xA6 = 166) из этой последовательности, а не второй символ . Это байт продолжения, поэтому он недействителен, если присутствует отдельно, и отображается как символ замены .
Не использовать индексирование символов в строках UTF-8. Для правильного поведения вы должны использовать функции mb_
.