Конечная схема кодирования смайликов

Это моя среда: клиент -> приложение для iOS, сервер -> PHP и MySQL.

Данные от клиента к серверу осуществляются через HTTP POST.

Данные от сервера к клиенту выполняются с помощью json.

Я хотел бы добавить поддержку эмодзи или любого персонажа utf8mb4 в целом. Я ищу правильный способ справиться с этим по моему сценарию.

Мои вопросы следующие:

  1. Позволяет ли POST utf8mb4, или я должен преобразовать данные в клиенте в обычный utf8?

  2. Если моя БД имеет параметры сортировки и набор символов utf8mb4, значит ли это, что я должен иметь возможность хранить «сырые» эмодзи?

  3. Стоит ли пытаться работать в БД с utf8mb4 или это безопаснее / лучше / больше поддерживается для работы в utf8 и кодирования символов? Если да, какой метод кодирования я должен использовать, чтобы он работал безупречно в Objective-C и PHP (и Java для будущей версии Android)?

Прямо сейчас у меня есть БД с utf8mb4, но я получаю ошибки при попытке сохранить сырой эмодзи. С другой стороны, я могу хранить не-UTF8 символы, такие как ¿ или же á,

Когда я получаю эти символы в PHP, мне сначала нужно выполнить SET CHARACTER SET utf8 (если я получу их в utf8mb4 json_decode функция не работает), то такие символы кодируются (например, ¿ закодирован в \u00bf).

6

Решение

MySQL, utf8 кодировка на самом деле не UTF-8, это подмножество UTF-8, поддерживающее только базовую плоскость (символы до U + FFFF). Большинство смайликов используют кодовые точки выше, чем U + FFFF. MySQL, utf8mb4 является актуальный UTF-8 который может кодировать все эти кодовые точки. За пределами MySQL нет такой вещи как utf8mb4, есть только UTF-8. Так:

Позволяет ли POST utf8mb4, или я должен преобразовать данные в клиенте в обычный utf8?

Опять же, нет такой вещи, как «utf8mb4». HTTP POST-запросы поддерживают любые необработанные байты, если ваш клиент отправляет данные в кодировке UTF-8, все в порядке.

Если моя БД имеет параметры сортировки и набор символов utf8mb4, значит ли это, что я должен иметь возможность хранить «сырые» эмодзи?

Да.

Стоит ли пытаться работать в БД с utf8mb4 или это безопаснее / лучше / больше поддерживается для работы в utf8 и кодирования символов?

Боже, используй сырой UTF-8 (utf8mb4) для всего святого.

Когда я получаю эти символы в PHP, мне сначала нужно выполнить SET CHARACTER SET utf8

Ну, вот твоя проблема; направить ваши данные через MySQL utf8 charset отбросит любые символы выше U + FFFF. использование utf8mb4 весь путь через MySQL.

если я получаю их в utf8mb4, функция json_decode не работает

Вы должны будете точно указать, что это значит. JSON-функции PHP должны нормально обрабатывать любую кодовую точку Unicode, если она действительна в UTF-8:

echo json_encode('��');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
��
8

Другие решения

Используйте utf8mb4 в MySQL:

  • SET NAMES utf8mb4
  • Объявите таблицу / столбцы CHARACTER SET utf8mb4
  • Emoji и некоторые китайские иероглифы будут работать в utf8mb4, но не в utf8 в MySQL.

Используйте UTF-8 для других целей:

  • HTML:

¿ или же á (или, по крайней мере, могут быть) закодированы в utf8 (utf8mb4)

2

По вопросам рекламы [email protected]