можно использовать $ str [n] для строки китайских символов? - PullRequest
2 голосов
/ 05 апреля 2019
<?php   
    $str ='如果';
    var_dump($str[1]);
    echo '<br />';
    var_dump(ord($str[1]));
    echo '<br />';
    echo mb_substr($str , 1 , 1)
?>

Это выведет что-то вроде:

строка (1) " "

INT (166)

Я хочу получить второй символ , mb_substr может правильно его получить, в то время как $ str [n] не работает. Можно ли вообще использовать $str[n] для работы с символами utf-8?

1 Ответ

4 голосов
/ 05 апреля 2019

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_.

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