php tolowercase русские символы
strtolower и кириллица
Сейчас бегло пробежимся по проблеме с php функциями strtolower и strtoupper а именно с переводом строки в нижний и верхний регистр при использовании кириллических символов. На примерах, для экономии времени, я буду показывать работу только с функцией strtolower т.к. для strtoupper всё тоже самое.
Итак, ниже приведу возможные развития ситуации, выбирайте решение по выбору.
Старые методы работы со строками
Самый ламерский и ужасный способ это «изобрести велосипед», т.е. сделать свою функцию для перевода строки в нижний регистр. Будет как то так:
Т.е. тупо перебираем все символы и заменяем их копии но в другом регистре. Думаю не нужно объяснять, что так делать не следует.
Более переносимый вариант выглядит так:
Тут в качестве устанавливаемой локали передаём массив названий для разных операционных систем. Попытки установки локали будут продолжаться до первой удачной установки или до конца массива.
Новые методы
Рекомендую использовать в своих скриптах именно эти новые универсальные методы. Конечно они более ресурсотребовательные но это оправданно. При использовании мультибайтовых аналогов функций не нужно замарачиваться с установками локали в скрпте т.к. на поведение этих функций не влияют региональные настройки системы.
Пример использования mb_strtolower :
Явно задаём символьную кодировку UTF-8 для переносимости кода. Так будет работать везде.
Спасибо за внимание, надеюсь теперь проблема к кириллическими кодировками в строках у вас решена.
Сегодня разберем функцию strtolower, которая преобразует строку в нижний регистр. Т.е. все буквы делает строчными в php. Попробуем разобраться в ошибках связанных с функцией strtolower, примеры strtolower, напишем свою функцию для кириллицы преобразующие большие буквы в маленькие, но не только о strtolower, но и коснемся mb-strtolower.
Естественно нужно начать с определения даннйо функции:
Все о функции strtolower
Что такое strtolower
Синтаксис функции strtolower
Разбор синтаксиса функции strtolower
Использование strtolower:
Самое удобное, поместить в переменную текст, который пропускается через функцию и получается соответствующая строка.
Ну и далее оборачиваем переменную функцией strtolower:
И выводим результат с помощью echo
Пример использования strtolower для латиницы:
Далее применим к данной строке strtolower с использованием функции echo :
Результат применения strtolower к английскому тексту, который написан «ПРОПИСНЫМИ»
После этого можем переходить к кириллице!
Использование strtolower для кириллицы:
Опять поступаем со строкой, как в выше идущем пункте:
Расположим данный вывод прямо здесь и получим:
Мы видим, что ничего у нас не произошло…
Почему не сработала функция strtolower
Насколько я понимаю, что проблема в данном случае с кодировкой utf-8 для кириллицы! Дело в том, что кириллица в данной кодировке имеет не один символ а два. и strtolower просто не понимает, что от него хотят.
Чтобы показать в живую, чем отличается кириллица от латиницы:
Strtolower не работает для кириллицы
Но если например мы будем использовать данную функцию в таком виде:
То получим такой результат:
��� �������� �����, ������� ����� �������������� ��������� ���������� Чтобы mb_strtolower заработала с кириллицей UTF-8 ей нужно придать кодировку, таким образом:
Смотрим, что у нас в итоге получилось:
это тестовый текст, который будет иллюстрировать поведение стролловер
Собственная функция Strtolower для кириллицы!
Сталкивались с Strtolower для кириллицы!? Или может вы использовали mb-strtolower для кириллицы!? Эти функции работали и как впечатление!?
Когда в последний раз меня вывела из себя функция mb-strtolower – оказывается – эту хрень еще и подключать надо! Какая важная фифа, что она может даже быть и отключенная! Не то, что я не могу разобраться, как её включить – но просто это так достало, что просто нет тех слов цензурных слов, которые могли бы выразить все то, что я им хочу сказать!
Сделаем собственную функцию Strtolower для кириллицы!
Нам нужна такая функция Strtolower для кириллицы, чтобы она работала всегда и везде и чтобы больше никогда я не встречался с этой проблемой – мы просто напишем собственную функцию Strtolower для кириллицы!
Нам понадобится массив, который представляет из себя ключ – Большая кириллическая буква(верхний регистр = «ПРОПИСНЫЕ»), значение маленькая кириллическая буква(нижний регистр = «строчные»)
Еще нам понадобится функция strtr – которая преобразует найденные ключи в значения!
2). Поместим наш тестовый текст с прописными буквами в переменную
И обработаем дальше уже нашей функцией Strtolower для кириллицы
Результат работы собственной функции для кириллицы!
Собственная функция Strtolower для кириллицы и латиницы!
Пойдем дальше! Чем каждый раз вспоминать,какая функция работает там, работает сям! Сделаем функцию для кириллицы и латиницы, дарю:
Теперь давайте испытаем, сразу на двух текстах. что мы сделаем!?
Выведем наши текста таикм образом:
Результат работы собственной функции strollower
Онлайн функция Strtolower для текста!
Теперь на нашем сайте вы можете привести весь текст, который так или иначе написан с включением больших(прописных) букв, превратить в текст написанный строчными, т.е. маленькими!
Как работает онлайн Strtolower
В поле ввода пишем или вставляем текст ПРОПИСНЫМИ! И нажимаем отправить! И вы получите результат! Пока только Русский и английский языки!
Сообщение системы комментирования :
Форма пока доступна только админу. скоро все заработает. надеюсь.
strtolower
(PHP 4, PHP 5, PHP 7, PHP 8)
strtolower — Преобразует строку в нижний регистр
Описание
Принадлежность того или иного символа к буквенным определяется с учётом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ Ä не будет преобразован.
Список параметров
Возвращаемые значения
Возвращает строку в нижнем регистре.
Примеры
Пример #1 Пример использования strtolower()
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
User Contributed Notes 16 notes
strtolower(); doesn’t work for polish chars
for cyrillic and UTF 8 use mb_convert_case
//output is: австралия
?>
the function arraytolower will create duplicate entries since keys are case sensitive.
I prefer this method
Array
(
[test1] => asgafasdaad
[TEST2] => asddhshsdgb
[TeSt3] => asdasda@asdadadasdasdgh
)
Array
(
[test1] => asgafasdaad
[test2] => asddhshsdgb
[test3] => asdasda@asdadadasdasdgh
)
echo fullLower ( «Ã É Ò Õ ÚÙÛ» );
//results ã é ò õ úùû
//adapted from fullUpper on strtoupper manual
?>
When you’re not sure, how the current locale is set, you might find the following function useful. It’s strtolower for utf8-formatted text:
If you’re considering using the below unhtmlentities function from phpContrib, I would suggest this one as an alternative:
There’s a ucfirst «function» to make the first character uppercase, but there’s no «lcfirst» function to make the first character lowercase. Here’s my own code to accomplish this.
I found this particularly useful for generating XML nodes with the Reflection class.
Heres a small function I wrote to stop people from submitting data that is ALL IN CAPS SO THEY CAN GET MORE ATTENTION THAT THE REST OF THE USER SUBMITTED DATA on my website 🙂 If you can make it better, by all means do so. This function splits up words delimited by a space, and makes only the first letter of each word capitalized. You can easily modify it so it’s only the very first word of the string. I’ve also added some exceptions so you don’t make things like roman numerals look like «Iii» or «Xcmii» or something.
function RemoveShouting($string)
<
$lower_exceptions = array(
«to» => «1», «a» => «1», «the» => «1», «of» => «1»
);
$higher_exceptions = array(
«I» => «1», «II» => «1», «III» => «1», «IV» => «1»,
«V» => «1», «VI» => «1», «VII» => «1», «VIII» => «1»,
«XI» => «1», «X» => «1»
);
To do case insensitive comparisons in a database, strtolower() can be a quick and dirty solution:
$Sql = «SELECT * FROM tablename WHERE LOWER(column_name) = ‘».strtolower($my_var).»‘»;
the strtolower version to support most amount of languages including russian, french and so on:
To convert an entire array to lower, I prefer this method;
If you ever need to strtolower a string with href tags on it and doesn’t want to mess with the characters inside a tag, this is for you.
?>
this:
echo loweroutsidetags(‘aALalala ‘)
Проблема с кириллицей в php
Проект разрабатывается в кодировке utf-8. Столкнулся с проблемой обработки строк с символами кириллицы. Код
Т.е. для кириллицы функция не работает.
Что необходимо сделать, чтобы на выходе вместо «Доп�» получить «Дополни»?
4 ответа 4
Если коротко, то для мультибайтовых кодировок используют mb_substr()
Если сайт разрабатывается, как вы пишите, в UTF-8, значит надо разрабатывать UTF-8. Чтобы все мультибайтовые функции работали по умолчанию с разрабатываемой кодировкой, ее надо задать в самом начале (и желательно проверить, задалась или нет):
Если все ок, можете юзать все mb_ без прописки кодировки.
Забыл написать, почему это важно, ну, если вы разрабатываете. Потому что при использовании имени функции в качестве callback прописывать кодировку будет некуда.
mb_substr() вместо substr()
Чтобы в PHP работать с кириллическими строками посимвольно(включая извлечение подстроки и др.) нужно использовать специальные функции: http://php.net/manual/ru/ref.mbstring.php.
Всё из-за того, что на латинице 1 символ = 1 бит, поэтому:
Но кирилические символы занимают 2 бита, поэтому:
При этом можно это учитывать и работать в таком ключе:
Или разбить строку через str_split, указав split_length = 2:
Но так лучше не делать, потому что таким образом нельзя будет работать теперь с латиницей и остальными символами:
Кстати, чтобы нормально разделить сроку с русскими символами на массив символов, то лучше всего это делать так:
Определение кодировки текста в PHP — обзор существующих решений плюс еще один велосипед
Столкнулся с задачей — автоопределение кодировки страницы/текста/чего угодно. Задача не нова, и велосипедов понапридумано уже много. В статье небольшой обзор найденного в сети — плюс предложение своего, как мне кажется, достойного решения.
Если кратко — он не работает.
Давайте смотреть:
Как видим, на выходе — полная каша. Что мы делаем, когда непонятно почему так себя ведет функция? Правильно, гуглим. Нашел замечательный ответ.
Чтобы окончательно развеять все надежды на использование mb_detect_encoding(), надо залезть в исходники расширения mbstring. Итак, закатали рукава, поехали:
Постить полный текст метода не буду, чтобы не засорять статью лишними исходниками. Кому это интересно посмотрят сами. Нас истересует строка под номером 593, где собственно и происходит проверка того, подходит ли символ под кодировку:
Вот основные фильтры для однобайтовой кириллицы:
Windows-1251 (оригинальные комментарии сохранены)
ISO-8859-5 (тут вообще все весело)
Как видим, ISO-8859-5 всегда возвращает TRUE (чтобы вернуть FALSE, нужно выставить filter->flag = 1).
Когда посмотрели фильтры, все встало на свои места. CP1251 от KOI8-R не отличить никак. ISO-8859-5 вообще если есть в списке кодировок — будет всегда детектиться как верная.
В общем, fail. Оно и понятно — только по кодам символов нельзя в общем случае узнать кодировку, так как эти коды пересекаются в разных кодировках.
2. Что выдает гугл
А гугл выдает всякие убожества. Даже не буду постить сюда исходники, сами посмотрите, если захотите (уберите пробел после http://, не знаю я как показать текст не ссылкой):
http:// deer.org.ua/2009/10/06/1/
http:// php.su/forum/topic.php?forum=1&topic=1346
3. Поиск по хабру
2) на мой взгляд, очень интересное решение: habrahabr.ru/blogs/php/27378/#comment_1399654
Минусы и плюсы в комменте по ссылке. Лично я считаю, что только для детекта кодировки это решение избыточно — слишком мощно получается. Определение кодировки в нем — как побочный эффект ).
4. Собственно, мое решение
Идея возникла во время просмотра второй ссылки из прошлого раздела. Идея следующая: берем большой русский текст, замеряем частоты разных букв, по этим частотам детектим кодировку. Забегая вперед, сразу скажу — будут проблемы с большими и маленькими буквами. Поэтому выкладываю примеры частот букв (назовем это — «спектр») как с учетом регистра, так и без (во втором случае к маленькой букве добавлял еще большую с такой же частотой, а большие все удалял). В этих «спектрах» вырезаны все буквы, имеющие частоты меньше 0,001 и пробел. Вот, что у меня получилось после обработки «Войны и Мира»:
Спектры в разных кодировках (ключи массива — коды соответствующих символов в соответствующей кодировке):
Далее. Берем текст неизвестной кодировки, для каждой проверяемой кодировки находим частоту текущего символа и прибавляем к «рейтингу» этой кодировки. Кодировка с бОльшим рейтингом и есть, скорее всего, кодировка текста.
Результаты
У-упс! Полная каша. А потому что большие буквы в CP1251 обычно соответствуют маленьким в KOI8-R. А маленькие буквы используются в свою очередь намного чаще, чем большие. Вот и определяем строку капсом в CP1251 как KOI8-R.
Пробуем делать без учета регистра («спектры» case insensitive)
Как видим, верная кодировка стабильно лидирует и с регистрозависимыми «спектрами» (если строка содержит небольшое количество заглавных букв), и с регистронезависимыми. Во втором случае, с регистронезависимыми, лидирует не так уверенно, конечно, но вполне стабильно даже на маленьких строках. Можно поиграться еще с весами букв — сделать их нелинейными относительно частоты, например.
5. Заключение
В топике не расмотрена работа с UTF-8 — тут никакий принципиальной разницы нету, разве что получение кодов символов и разбиение строки на символы будет несколько длиннее/сложнее.
Эти идеи можно распространить не только на кириллические кодировки, конечно — вопрос только в «спектрах» соответствующих языков/кодировок.
P.S. Если будет очень нужно/интересно — потом выложу второй частью полностью работающую библиотеку на GitHub. Хотя я считаю, что данных в посте вполне достаточно для быстрого написания такой библиотеки и самому под свои нужды — «спектр» для русского языка выложен, его можно без труда перенести на все нужные кодировки.
UPDATED
В комментариях проскочила замечательная функция, ссылку на которую я опубликовал под графом «убожество». Может быть погорячился со словами, но уж как опубликовал, так опубликовал — редактировать такие вещи не привык. Чтобы не быть голословным, давайте разберемся, работает ли она на 100%, как об этом говорит предполагаемый автор.
1) будут ли ошибки при «нормальной» работе этой функции? Предположим, что контент у нас на 100% валидный.
ответ: да, будут.
2) определит ли она что-нибудь кроме UTF-8 и не-UTF-8?
ответ: нет, не определит.