Это моя среда: клиент -> приложение для iOS, сервер -> PHP и MySQL.
Данные от клиента к серверу осуществляются через HTTP POST.
Данные от сервера к клиенту выполняются с помощью json.
Я хотел бы добавить поддержку эмодзи или любого персонажа utf8mb4 в целом. Я ищу правильный способ справиться с этим по моему сценарию.
Мои вопросы следующие:
Позволяет ли POST utf8mb4, или я должен преобразовать данные в клиенте в обычный utf8?
Если моя БД имеет параметры сортировки и набор символов utf8mb4, значит ли это, что я должен иметь возможность хранить «сырые» эмодзи?
Стоит ли пытаться работать в БД с utf8mb4 или это безопаснее / лучше / больше поддерживается для работы в utf8 и кодирования символов? Если да, какой метод кодирования я должен использовать, чтобы он работал безупречно в Objective-C и PHP (и Java для будущей версии Android)?
Прямо сейчас у меня есть БД с utf8mb4, но я получаю ошибки при попытке сохранить сырой эмодзи. С другой стороны, я могу хранить не-UTF8 символы, такие как ¿
или же á
,
Когда я получаю эти символы в PHP, мне сначала нужно выполнить SET CHARACTER SET utf8
(если я получу их в utf8mb4 json_decode
функция не работает), то такие символы кодируются (например, ¿
закодирован в \u00bf
).
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"');
Используйте utf8mb4 в MySQL:
SET NAMES utf8mb4
CHARACTER SET utf8mb4
Используйте UTF-8 для других целей:
¿
или же á
(или, по крайней мере, могут быть) закодированы в utf8 (utf8mb4)