Примечание. Я думаю, что я знаю, вероятно, неправильно, поэтому, пожалуйста, любезно исправьте мои знания 🙂
Я просто ответил на вопрос о 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 не обрабатывает каждый символ как байт, но он обрабатывает каждый байт как символ. Таким образом, множественные символы рассматриваются как несколько символов (и, возможно, не тот, который вы ожидаете).