Юникод в PHP-приложении
Вопрос
Как вы работаете с UTF-8 в PHP-проекте, чтобы не было «кракозябр»?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Строки 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 ошибок.