Решение: как сделать первую букву заглавной в UTF-8
В PHP есть функция ucfirst()
для капитализации первого слова строки (делает первую букву заглавной). Но она не работает с многобайтными строками (например, в кодировке UTF-8). Есть функции работы с многобайтными строками, названия которых начинаются с mb_
(multi byte). Но среди них нет функции mb_ucfirst()
, которую мы сейчас напишем.
Нам понадобится функция mb_strtoupper()
(делает все буквы строки заглавными) и mb_substr()
(возвращает часть строки). Эти функции в PHP уже есть — если установлено расширение PHP mbstring (почти всегда установлено). Если же нет, наша функция вернёт исходную строку без изменений.
Принцип прост. Возьмём от строки первую букву, сделаем её заглавной и присоединим к ней остальную часть строки:
# Делает первую букву строки заглавной (капитализация первого слова) if ( ! function_exists( 'mb_ucfirst' ) ) { function mb_ucfirst( $s, $e = 'UTF-8' ) { if ( ! function_exists( 'mb_substr' ) ) return $s; $first = mb_substr( $s, 0, 1, $e ); $second = mb_substr( $s, 1, mb_strlen( $s, $e ) -1, $e ); return mb_strtoupper( $first, $e ) . $second; } }
Достаточно добавить этот PHP-код в ваш скрипт, и вы сможете использовать функцию echo mb_ucfirst( 'например, так' )
— в результате выведется текст «Например, так». Даже если когда-нибудь в PHP добавят функцию «mb_ucfirst», ошибки не будет, потому что мы объявляем нашу функцию только при наличии её отсутствия.
Если не указана кодировка, по умолчанию имеется ввиду UTF-8. Вы можете использовать функцию с явным указанием кодировки, если она у вас отлична от UTF-8: mb_ucfirst( 'строка', 'KOI8-R' )
8 ответов к “Решение: как сделать первую букву заглавной в UTF-8”
Небольшое уточнение.
Когда функция определяется через if (), её необходимо располагать до первого вызова. В таком случае:
echo mb_ucfirst ($s);
if ( ! function_exists ( 'mb_ucfirst' ) ) {
// ...
}
функция mb_ucfirst () будет ещё не определена (разговор именно о первом упоминании). Обратный порядок к ошибкам не приведёт:
if ( ! function_exists ( 'mb_ucfirst' ) ) {
// ...
}
echo mb_ucfirst ($s);
Но удивительно, почему разработчики не включили подобную функцию сразу.
Да-да, в плагине crazy titles я такой алгоритм использовал.
Павел, это для меня"высший пилотаж". Но для информации хорошо, буду знать, что и такое можно делать.Спасибо. Скажите, а вы, случайно не знаете, как правильно работать с визуальным редактором Вордпресс4.1.1.? Что-то у меня не получается пока что. С уважением, Анна.
Анна, никаких особых приёмов работы с визуальным редактором не знаю. Но, если у вас проблемы с его загрузкой, попробуйте открыть создание новой записи и нажать Ctrl+F5. Это заставит браузер загрузить с сервера все скрипты, и файлы оформления. Дождитесь полной загрузки, затем браузер по-идее должен эти файлы уже из своего кэша брать и быстро открывать
Это наверное удобно тем, кто публикует стихи. А что, если будет две колонки например? Будут ли отличия в работе данной функции?
Надежда, а что понимается под двумя колонками?
В тексте для перевода строки используется \r\n в виндузе (\n — никсы, \r — мак). В html используется тег br.
Стало быть, если нужно для некой части сделать первую букву заглавной, требуется предварительно разбить блок текста на части, а затем к каждой части применить эту функцию.
Надежда, вы как всегда полны идей. А функция всего лишь обрабатывает строку, которая в неё передана. Теоретически, возможно организовать разбор стихотворения на стихи, и тогда функция сможет сделать первые буквы заглавными, даже если будет две колонки. Как уже заметил x64, описав даже некоторые технические подробности
Ой, одно время пыталась освоить html, а потом подружиться с php, но они не приняли меня в свою компанию, мало того, пинками вежливо попросили прочь... Но, кое-что я у первого успела урвать, самое простейшее, чем и пользуюсь иногда, назло супостатам... но, желание внедриться в неприятельские ряды у меня не исчезло, урывками делаю диверсии во вражеский тыл, правда, в общей сложности все больше из любопытства... таковы уж мы дамы... любопытны как кошки, непонятно, зато забавно...