Ответ вслух Middle Строки обновлено

Юникод в PHP-приложении

Вопрос

Как вы работаете с UTF-8 в PHP-проекте, чтобы не было «кракозябр»?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Главное помнить, что строка в PHP это просто байты. Поэтому кодировку я фиксирую на всех уровнях.

Что должно прозвучать в ответе

  • Строки PHP это байты, кодировку должен помнить разработчик

  • mb_* функции для текста, mb_internal_encoding или default_charset UTF-8

  • БД и соединение в utf8mb4 (MySQL), иначе эмодзи обрежутся

  • Заголовок Content-Type с charset=utf-8 и htmlspecialchars с UTF-8

  • preg_* с модификатором u

  • Нормализация и сортировка через intl (Normalizer, Collator)

Что могут спросить следом

  • Почему в MySQL нужен utf8mb4, а не utf8?
  • Что сделает preg_match без модификатора u с кириллицей?

Разбор

Главное помнить, что строка в PHP это просто байты. Поэтому кодировку я фиксирую на всех уровнях. В PHP default_charset UTF-8, для текста использую функции mb_*: длина, подстрока, регистр. Для регулярных выражений добавляю модификатор u, иначе . и классы символов работают по байтам, и кириллица режется.

В MySQL выбираю utf8mb4 для таблиц и соединения: старая utf8 хранит максимум 3 байта на символ и не вмещает эмодзи. Ответ отдаю с Content-Type: text/html; charset=utf-8, а при выводе экранирую htmlspecialchars с явной кодировкой.

Если нужно сравнивать или сортировать строки по правилам языка, нормализовать «й» и «й» из двух кодовых точек, беру расширение intl: Normalizer и Collator. И проверяю входные данные через mb_check_encoding, чтобы битые байты не попадали в базу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.