Unicode

Коротко

Международный стандарт, который присваивает свой номер каждому символу письменности мира — от латиницы и кириллицы до иероглифов и эмодзи.

Что такое «Unicode»

До Unicode каждая страна и система жили в своих кодировках: для русского — CP1251, KOI8-R, CP866. Один и тот же байт означал разные буквы, и текст, сохранённый в одной кодировке и открытый в другой, превращался в «кракозябры» вроде Привет вместо «Привет». Unicode решил проблему единым каталогом: у буквы «П» номер U+041F, у знака рубля — U+20BD, у смайлика — свой номер за пределами первых 65 536 позиций.

Unicode и UTF-8 — не одно и то же

Unicode — это таблица «символ — номер». Как номер записать в байты, решает кодировка. В вебе стандарт де-факто — UTF-8: латиница занимает в ней один байт, кириллица два, большинство иероглифов три, эмодзи четыре. В PHP это видно сразу:

echo strlen( 'Привет' );    // 12 — байты
echo mb_strlen( 'Привет' ); // 6 — символы
echo mb_substr( 'Привет', 0, 3 ); // «При», а substr() мог бы разрезать букву

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

Как это устроено в WordPress

Кодировку сайта задаёт константа DB_CHARSET в wp-config.php, в новых установках это utf8mb4. Название не случайное: в MySQL старая кодировка utf8 хранит не больше трёх байт на символ и не вмещает эмодзи. Текст с ними обрезался или не сохранялся вовсе. WordPress начиная с версии 4.2 переводит таблицы на utf8mb4, если сервер базы это поддерживает. Правила сравнения и сортировки строк в базе задаёт сопоставление.

Откуда берутся кракозябры

  • Дамп базы выгрузили в одной кодировке, а импортировали, указав другую.
  • Файл темы сохранён в CP1251, а страница объявлена как UTF-8.
  • Файл PHP сохранён в UTF-8 с BOM — невидимой меткой в начале. Она выводится до заголовков, и WordPress сообщает, что заголовки уже отправлены.

Лечится это не заменой букв, а поиском места, где данные прочитали не в той кодировке.

Обновлено:

Все термины раздела «WordPress»

Что будем искать? Например,Продвижение