Title-case строки с поддержкой Юникода
Напишите функцию capitalize, которая приводит первую букву каждого слова в строке к верхнему регистру. Она должна работать для нелатинских алфавитов, например кириллицы.
<?php
echo capitalize('hello avito'); // Hello Avito
echo capitalize('привет авито'); // Привет Авито
function capitalize(string $string) {
// ваш код здесь
}
Допишите реализацию.
Используйте mb_convert_case($string, MB_CASE_TITLE). Многобайтовое семейство mb_* понимает UTF-8, поэтому корректно приводит первую букву каждого слова к верхнему регистру для кириллицы. Не-многобайтовый ucwords трактует каждый байт как символ и портит многобайтовые буквы, давая кракозябры на привет.
- ✗Брать
ucwords/ucfirst, работающие побайтово и ломающие UTF-8 - ✗Считать, что UTF-8 кодировка исходника делает побайтовые функции безопасными для Юникода
- ✗Забыть задать или передать кодировку, оставив
mb_*угадывать неверную charset
- →Почему
strlen('привет')возвращает 12, а не 6, и какая функция вернёт 6? - →Как заставить
mb_*считать кодировкой UTF-8 без передачи её в каждом вызове?
Строки в PHP — это последовательности байтов, а не символов. Латинская буква занимает один байт в UTF-8, но кириллическая — два. Поэтому функции, работающие побайтово (strlen, ucwords, ucfirst, strtoupper), портят многобайтовый текст.
<?php
function capitalize(string $string) {
return mb_convert_case($string, MB_CASE_TITLE);
}
echo capitalize('hello avito'); // Hello Avito
echo capitalize('привет авито'); // Привет Авито
mb_convert_case($s, MB_CASE_TITLE) понимает границы слов и регистры Юникода. Для надёжности задайте кодировку по умолчанию через mb_internal_encoding('UTF-8') или передавайте её третьим аргументом.