MySQL's utf8
charset is niet echt UTF-8 , het is een subset van UTF-8 die alleen het basisvlak ondersteunt (tekens tot U+FFFF). De meeste emoji gebruiken codepunten die hoger zijn dan U+FFFF. MySQL's utf8mb4
is werkelijke UTF-8 die al die codepunten kan coderen. Buiten MySQL bestaat er niet zoiets als "utf8mb4", er is alleen UTF-8. Dus:
Nogmaals, er bestaat niet zoiets als "utf8mb4". HTTP POST-verzoeken ondersteunen alle onbewerkte bytes, als uw klant UTF-8-gecodeerde gegevens verzendt, zit u goed.
Ja.
God nee, gebruik onbewerkte UTF-8 (utf8mb4
) voor alles wat heilig is.
Nou, daar is je probleem; het kanaliseren van uw gegevens via MySQL's utf8
charset verwijdert alle tekens boven U+FFFF. Gebruik utf8mb4
helemaal door MySQL.
U moet aangeven wat dat precies betekent. De JSON-functies van PHP zouden elk Unicode-codepunt prima moeten kunnen verwerken, zolang het maar geldige UTF-8 is:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀