Почему этот str_ireplace () работает с не ASCII-строкой? - PullRequest
7 голосов
/ 28 марта 2011

Примечание: То, что я знаю, вероятно, неправильно, поэтому, пожалуйста, пожалуйста, исправьте мои знания:)


Я только что ответил на вопрос о UTF-8 иPHP.

Я предложил использовать str_ireplace('Волгоград', '', $a).

Я не ожидал, что это сработает, но это сработало.

Я всегда думал, что PHP обрабатывает один байткак один символ, поэтому вам нужно использовать функции mb_* для получения точных результатов при использовании символов вне диапазона ASCII.

Я предполагал, что русские символы будут занимать> 1 байт каждый.

Я думал, что str_replace() будет работать, потому что байты могут быть сопоставлены независимо от того, являются ли они многобайтовыми или нет, если они в порядке.

Я думал, str_ireplace() будет не работатьпотому что PHP не знает, как отобразить символы, не входящие в ASCII, в их эквивалент в альтернативном регистре.Но, это сработало .


Где и как я ошибаюсь?Дайте мне как можно больше информации:)

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

Он работает, делая текст строчными, передавая его функциям libc, которые зависят от настроек локали;Соответствующие настройки означают, что текст будет правильно записан в нижнем регистре, если для байтов используется правильная кодировка.

3 голосов
/ 28 марта 2011

Другое возможное объяснение. Плоскости Unicode имеют те же атрибуты, что и диапазон ISO-8859-1.

Преобразование заглавной буквы в строчную просто требует добавления 0x20 для диапазона ASCII:

0x41   A
0x61   a

И - я не удосужился посмотреть - думаю, то же самое для диапазона Latin-1 в 0xC0-0xDF. И это может совпадать с русскими буквами в диапазоне Unicode:

d092d09ed09bd093d09ed093d0a0d090d094   ВОЛГОГРАД
d0b2d0bed0bbd0b3d0bed0b3d180d0b0d0b4   волгоград

Разница только в том, что в байтах было добавлено 0x20, которые, как предполагалось, были символами L1. Так что, вероятно, это действительно просто настройка локали.

0 голосов
/ 28 марта 2011

И наоборот: PHP не обрабатывает каждый символ как байт, но он обрабатывает каждый байт как символ. Таким образом, несколько символов рассматриваются как несколько символов (и, вероятно, не тот, который вы ожидаете).

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