Intereting Posts
запускать другой скрипт, когда установлен флажок событие onclick открывает окно и в поле отправляет его ссылки на php-функцию, которые устанавливают некоторые значения в db Каков тип этой строки? а: 1: {s: 2: «ан»;} рассчитать воскресенье между двумя датами Проблемы CloudSQL PDO (unix_socket) в Google App Engine Как можно изменить 2-мерный многомерный массив на n уровней? Величина ввода формы на основе выбранного значения параметра Структура каталогов Parse (строки) для JSON с использованием PHP Эквивалент ASP.NET HttpModules в PHP автоматический моментальный снимок динамической веб-страницы Как я могу показать изображения вне корневого каталога в моем приложении php? Нужна помощь в преобразовании кода SOAP PHP в Groovy с использованием groovy-wslite Не удалось подключиться к порту www.googleapis.com 443: Сеть недоступна Как определить, загрузил ли пользователь файл больше, чем post_max_size? Как я могу добавить элемент в Laravel Eloquent Collection по индексу?

Окончательная схема кодирования emoji

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

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

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

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

Мои вопросы заключаются в следующем:

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

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

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

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

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

Кодировка MySQL utf8 самом деле не UTF-8 , это подмножество UTF-8, поддерживающее только базовую плоскость (символы до U + FFFF). Большинство emoji используют кодовые пункты выше 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

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

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

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

 echo json_encode('😀'); "\ud83d\ude00" echo json_decode('"\ud83d\ude00"'); 😀 

Использовать utf8mb4 для MySQL:

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

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

  • HTML:

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