В одном из наших проектов, который тесно связан с генерацией контента пользователями, появилась потребность в поддержке эмодзи. Обычно для записи содержимого сайта хватает и трехбайтной кодировки utf8, но для хранения Emoji потребуется четырехбайтная utf8mb4 (UTF-8 Multibyte 4), которая доступна в MySQL 5.5.3+ и более новых версиях.
Задача настройки возможности использования Emoji решается в два шага.
Немного о кодировках и представлениях
Кодировка (character set) — это способ описания набора символов. Например, UTF-8, ASCII, KOI8-R, CP1251. Представление (collation) — способ описания порядка букв в кодировках, который используется для сортировок. Рассмотрим основные отличия представлений.
В utf8_bin всё регистрозависимо. Символ 'A' не равен символу 'a' при поиске, а сортировка происходит в порядке следования в таблице символов для данной кодировки.
Представления, названия которых оканчиваются на _ci (case-insensitive), не увидят разницы между 'aAA' и 'aaa' при поиске и различаются только способами сортировки.
utf8_general_ci работает быстрее, потому что при сортировке не учитываются особенности в порядке букв в некоторых языках. Например, ÀÁÅåāă = A или ü = U.uft8_unicode_ci — чуть медленнее, но сортировки будут правильные во всех языках. Например, ß (эсцет немецкий) будет располагаться рядом с ss.
Настройка кодировки таблицы
Первым делом нужно сменить кодировку полей или целой таблицы в базе данных, где могут храниться эмодзи.
Например, в таблице Comments зададим полю text с типом text кодировку utf8mb4 и представление utf8mb4_general_ci.
ALTER TABLE `Comments` MODIFY `text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Настройка кодировки подключения
Данные в таблице теперь хранятся в правильной кодировке, поэтому осталось настроить подключение к базе данных.
Перед выполнением запросов в базу данных задайте кодировку, в которой собираетесь отправлять данные.
mysql_query('SET NAMES utf8mb4');
При наличии конфигурационного файла можно в нем изменить значение charset с utf8 на utf8mb4.
array(
'type' => 'MySQL',
'connection' => array(
'hostname' => '127.0.0.1',
'database' => 'dbname',
'username' => 'localuser',
'password' => '',
),
'charset' => 'utf8mb4',
)
Результат
Теперь вы можете использовать эмодзи в своих проектах. 😼
К сожалению, эмодзи отображаются ещё не на всех устройствах и могут выглядеть по-разному.
Существуют решения, позволяющие заменять символы Emoji на соответствующие изображения там, где они не доступны. Мы используем https://github.com/neSpecc/emoji-parser. Так, смайлы увидят пользователи даже старых устройств.