utf8
de MySQL charset no es realmente UTF-8 , es un subconjunto de UTF-8 que solo admite el plano básico (caracteres hasta U+FFFF). La mayoría de los emoji usan puntos de código superiores a U+FFFF. utf8mb4
de MySQL es UTF-8 real que puede codificar todos esos puntos de código. Fuera de MySQL no existe tal cosa como "utf8mb4", solo existe UTF-8. Entonces:
Nuevamente, no hay tal cosa como "utf8mb4". Las solicitudes HTTP POST admiten cualquier byte sin procesar, si su cliente envía datos codificados en UTF-8, está bien.
Sí.
Dios no, usa UTF-8 sin formato (utf8mb4
) por todo lo que es santo.
Bueno, ahí está tu problema; canalizando sus datos a través de utf8
de MySQL charset descartará cualquier carácter por encima de U+FFFF. Utilice utf8mb4
todo el camino a través de MySQL.
Tendrás que especificar qué significa eso exactamente. Las funciones JSON de PHP deberían poder manejar cualquier punto de código Unicode sin problemas, siempre que sea UTF-8 válido:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀