utf8
von MySQL charset ist nicht wirklich UTF-8 , es ist eine Teilmenge von UTF-8, die nur die Basisebene unterstützt (Zeichen bis zu U+FFFF). Die meisten Emoji verwenden Codepunkte höher als U+FFFF. utf8mb4
von MySQL ist tatsächliches UTF-8 die all diese Codepunkte kodieren kann. Außerhalb von MySQL gibt es so etwas wie "utf8mb4" nicht, es gibt nur UTF-8. Also:
Auch hier gibt es kein "utf8mb4". HTTP-POST-Anforderungen unterstützen alle rohen Bytes, wenn Ihr Client UTF-8-codierte Daten sendet, ist alles in Ordnung.
Ja.
Gott nein, benutze rohes UTF-8 (utf8mb4
) für alles, was heilig ist.
Nun, da ist Ihr Problem; Kanalisieren Ihrer Daten durch utf8
von MySQL charset verwirft alle Zeichen über U+FFFF. Verwenden Sie utf8mb4
den ganzen Weg durch MySQL.
Was das genau bedeutet, müssen Sie angeben. Die JSON-Funktionen von PHP sollten in der Lage sein, jeden Unicode-Codepunkt problemlos zu verarbeiten, solange es sich um gültiges UTF-8 handelt:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀