Arrachage de tête sur un sujet d'encodage de caractères :
j'ai une appli php/mysql toute en iso8859-1
Je construis un petit système d'envoi d'emails, et j'ai besoin de caser un emoji dans le sujet.
Pour ça il faut passer en utf-8, ce qui n'est pas trop un souci. Je prends mes données en bdd, je fais de l'utf8_encode() des champs et ça fonctionne nickel.
le fichier php qui gère ça est en utf-8
Par contre pour le sujet je heurte un mur.
Si dans le fichier php je mets un truc genre
$sujet = "\xf0\x9f\x95\x99 Alerte de rappel" ; |
Et que je mets ce sujet dans PHPMailer comme ça :
$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->CharSet = 'utf-8'; $mail->Encoding = 'base64';
...
$mail->Subject = $sujet ;
$mail->Body = $message;
$mail->send() ; |
Ca fonctionne nickel, mon sujet est bien encodé et j'ai mon emoji dans le mail.
Si par contre je récupère le sujet depuis ma bdd, que j'encode le sujet en utf8... ça ne fonctionne plus, j'ai \xf0\x9f\x95\x99 qui s'affiche tel quel dans le sujet.
J'ai tenté des bidouilles, genre ne pas convertir les \x... en utf8 pour les remettre tel quel après mais étrangement les fonctions preg_match ou replace ne fonctionnent pas avec ma regex qui me semble pourtant assez basique et qui fonctionne sur https://www.phpliveregex.com/ :
preg_match('/\\x[0-9a-f]{2}\\x[0-9a-f]{2}\\x[0-9a-f]{2}\\x[0-9a-f]{2}/i', $sujet, $emoji_arr); |
Ca ne retourne rien, que ce soit sur le sujet en iso ou converti en utf-8 !
Pourtant je ne devrais pas avoir de souci d'encodage vu que tous les caractères utilisés sont basiques (l'antislash, les chiffres, lettres sans accents...)
J'ai aussi tenté l'approche barbare de convertir le champ de ma bdd en utf8mb4_bin, de stocker la valeur encodée en utf8 dedans, de me connecter à la bdd en utf8 avant de faire ma requête pour récupérer le sujet... ben que dalle, ça ne change rien, ces pu***ns "d'antislash x" restent tel quel et ne deviennent pas des caractères unicode cohérents.
Un sujet qui fonctionne une fois reçu dans une boîte mail (affichage de la source) :
Subject: =?utf-8?Q?=F0=9F=95=99 Alerte de rappel?= |
Un sujet qui ne fonctionne pas :
Subject: =?utf-8?Q?\xf0\x9f\x95\x99 Alerte de rappel?= |
Et donc comme je disais, je ne peux pas faire de preg_replace des "\x" par des "=" car la regex ne trouve rien
Le mieux que je puisse faire c'est ne pas mettre l'antislash dans le champ en bdd, genre juste stocker "xf0x9fx95x99 Alerte..." et ensuite la regex fonctionne (genre matcher "/x([0-9a-f]{2})x([0-9a-f]{2})x([0-9a-f]{2})x([0-9a-f]{2})/i" et remplacer par =$1=$2=$3=$4 mais c'est assez moche je trouve.
Une idée ?
Message édité par depart le 08-09-2021 à 10:37:45