Это моя среда: клиент -> приложение iOS, сервер -> PHP и MySQL.
Данные от клиента к серверу выполняются через HTTP POST.
Данные от сервера к клиенту выполняются с помощью json.
Я хотел бы добавить поддержку emojis или любого символа utf8mb4 в целом. Я ищу правильный способ справиться с этим по моему сценарию.
Мои вопросы заключаются в следующем:
Разрешает ли POST utf8mb4, или мне нужно преобразовать данные на клиенте в обычный utf8?
Если моя БД имеет сортировку и набор символов utf8mb4, значит ли это, что я могу хранить «сырые» эможисы?
Должен ли я попытаться работать в БД с помощью 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
Используйте UTF-8 во всех других вещах:
¿
Или á
(или, по крайней мере, могут быть) закодированы в utf8 (utf8mb4)