Почему эта str_ireplace () работает с строкой, отличной от ASCII?

Примечание. Я думаю, что я знаю, вероятно, неправильно, поэтому, пожалуйста, любезно исправьте мои знания 🙂


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

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

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

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

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

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

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


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

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

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

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

 0x41 A 0x61 a 

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

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

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

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