utf8
do MySQL charset não é realmente UTF-8 , é um subconjunto de UTF-8 que suporta apenas o plano básico (caracteres até U+FFFF). A maioria dos emojis usa pontos de código maiores que U+FFFF. utf8mb4
do MySQL é UTF-8 real que pode codificar todos esses pontos de código. Fora do MySQL não existe "utf8mb4", existe apenas UTF-8. Então:Novamente, nada como "utf8mb4". As solicitações HTTP POST suportam qualquer byte bruto, se o seu cliente enviar dados codificados em UTF-8, tudo bem.
Sim.
Deus não, use UTF-8 bruto (
utf8mb4
) por tudo o que é sagrado. Bem, aí está o seu problema; canalizando seus dados através do
utf8
do MySQL charset descartará quaisquer caracteres acima de U+FFFF. Use utf8mb4
todo o caminho através do MySQL. Você terá que especificar o que isso significa exatamente. As funções JSON do PHP devem ser capazes de lidar com qualquer ponto de código Unicode bem, desde que seja UTF-8 válido:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀