Решение: как сделать первую букву заглавной в 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' )

Запись опубликована в рубрике Web-мастеринг с метками . Короткая ссылка для добавления в закладки: Решение: как сделать первую букву заглавной в UTF-8.

8 Responses

  1. x64 говорит:

    Небольшое уточнение.

    Когда функция определяется через if (), её необходимо располагать до первого вызова. В таком случае:

    echo mb_ucfirst ($s);

    if ( ! function_exists ( 'mb_ucfirst' ) ) {

    // ...

    }

    функция mb_ucfirst () будет ещё не определена (разговор именно о первом упоминании). Обратный порядок к ошибкам не приведёт:

    if ( ! function_exists ( 'mb_ucfirst' ) ) {

    // ...

    }

    echo mb_ucfirst ($s);

    Но удивительно, почему разработчики не включили подобную функцию сразу.

  2. Алексей Ершов говорит:

    Да-да, в плагине crazy titles я такой алгоритм использовал. =)

  3. Anna говорит:

    Павел, это для меня"высший пилотаж". Но для информации хорошо, буду знать, что и такое можно делать.Спасибо. Скажите, а вы, случайно не знаете, как правильно работать с визуальным редактором Вордпресс4.1.1.? Что-то у меня не получается пока что. С уважением, Анна.

    • Павлуха говорит:

      Анна, никаких особых приёмов работы с визуальным редактором не знаю. Но, если у вас проблемы с его загрузкой, попробуйте открыть создание новой записи и нажать Ctrl+F5. Это заставит браузер загрузить с сервера все скрипты, и файлы оформления. Дождитесь полной загрузки, затем браузер по-идее должен эти файлы уже из своего кэша брать и быстро открывать

  4. Это наверное удобно тем, кто публикует стихи. А что, если будет две колонки например? Будут ли отличия в работе данной функции?

    • x64 говорит:

      Надежда, а что понимается под двумя колонками? :)

      В тексте для перевода строки используется \r\n в виндузе (\n — никсы, \r — мак). В html используется тег br.

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

    • Павлуха говорит:

      Надежда, вы как всегда полны идей. ;) А функция всего лишь обрабатывает строку, которая в неё передана. Теоретически, возможно организовать разбор стихотворения на стихи, и тогда функция сможет сделать первые буквы заглавными, даже если будет две колонки. Как уже заметил x64, описав даже некоторые технические подробности

  5. Татьяна говорит:

    Ой, одно время пыталась освоить html, а потом подружиться с php, но они не приняли меня в свою компанию, мало того, пинками вежливо попросили прочь... Но, кое-что я у первого успела урвать, самое простейшее, чем и пользуюсь иногда, назло супостатам... но, желание внедриться в неприятельские ряды у меня не исчезло, урывками делаю диверсии во вражеский тыл, правда, в общей сложности все больше из любопытства... таковы уж мы дамы... любопытны как кошки, непонятно, зато забавно... :-)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Иногда ваш комментарий может не отобразиться сразу после публикации - будто пропал. Не волнуйтесь, он не пропадёт и появится потом, после моего одобрения.