utf8
на MySQL charset всъщност не е UTF-8 , това е подмножество от UTF-8, поддържащо само основната равнина (символи до U+FFFF). Повечето емоджи използват кодови точки, по-високи от U+FFFF. utf8mb4
на MySQL е действителен UTF-8 който може да кодира всички тези кодови точки. Извън MySQL няма такова нещо като "utf8mb4", има само UTF-8. И така:
Отново няма такова нещо като "utf8mb4". HTTP POST заявките поддържат всякакви необработени байтове, ако клиентът ви изпраща данни, кодирани с UTF-8, всичко е наред.
Да.
Господи, не, използвайте необработен UTF-8 (utf8mb4
) за всичко свято.
Е, това е вашият проблем; канализиране на вашите данни чрез utf8
на MySQL charset ще изхвърли всички знаци над U+FFFF. Използвайте utf8mb4
чак през MySQL.
Ще трябва да уточните какво точно означава това. JSON функциите на PHP трябва да могат да се справят добре с всяка кодова точка на Unicode, стига да е валиден UTF-8:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀