lorik Posté 21 Avril 2019 Posté 21 Avril 2019 Hello, les experts Je bidouille un peu de code pour me détendre, et j'ai un souci avec des encodages, je ne comprends jamais rien avec ces trucs J'ai des données textuelles en base, champ en latin1_swedish_ci. Si je les select et les affiche avec un bete echo, et les teste avec un mb_detect_encoding, ça me les indique bien en utf8, et les affichages sont ok (accents, etc....). Par contre, si je les passe à un json_encode(), puis fait un écho de mon Json, les caractères accentués sont pourris ('r\u00e9duit' pour 'réduit', par exemple). Bref, json_encode veut de l'utl8, je lui passe de l'utf8, et le résultat est crad, je ne vois pas à quel endroit je M... http://prntscr.com/net2r2 Merci de vos tuyaux !
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Je suis passé sous PHP7.2, et ai converti toute ma table d'origine en utf8_general_ci, sans plus de succès... C'est pourtant basique, comme code, mais là, j'ai même plus rien dans mon Json qui s'affiche. Sous 5.6, c'était pourri, mais j'avais quelque chose, là, plus rien... $dbdata = array(); $res2 = $mysqli->query($req2); while ($row = $res2->fetch_assoc()) { $dbdata[]=$row; // construction du tableau } // test pour vérifier que le tableau est bien rempli, => il l'est, mais toujours des pb d'accents //print_r ($dbdata); //Construction du Json $json=json_encode($dbdata); echo "affichage après json_encode, du Json, via un echo() <br>"; echo $json; // => vide à l'ecran Help please snif
Dan Posté 21 Avril 2019 Posté 21 Avril 2019 Tu as quel default_charset défini pour php ? C'est dans le php.ini. Pour php 7.2 c'est par défaut UTF-8 default_charset = "UTF-8" parfois sous php 5.6 on le met à ISO-8859-1 (sur demande de l'utilisateur, par défaut c'est UTF-8) !
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Salut Dan, c'est bien utf-8 le charset du phinfo
Dan Posté 21 Avril 2019 Posté 21 Avril 2019 De plus, si tu veux détecter qu'une chaîne est bien de l'UTF-8 avec mb_detect_encoding(), il faut utiliser le mode STRICT ! Citation If you try to use mb_detect_encoding to detect whether a string is valid UTF-8, use the strict mode, it is pretty worthless otherwise. <?php $str = 'áéóú'; // ISO-8859-1 mb_detect_encoding($str, 'UTF-8'); // 'UTF-8' mb_detect_encoding($str, 'UTF-8', true); // false ?>
Dan Posté 21 Avril 2019 Posté 21 Avril 2019 Ce qui m'interpelle c'est ça : Il y a 5 heures, lorik a dit : J'ai des données textuelles en base, champ en latin1_swedish_ci. Si je les select et les affiche avec un bete echo, et les teste avec un mb_detect_encoding, ça me les indique bien en utf8, et les affichages sont ok (accents, etc....). Parce que si ton champ est en latin1, un mb_detect_encoding($ta_chaine, 'UTF-8', true) devrait retourner FALSE !
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 ok, effectivement, avec ce 'strict', ya du mieux, donc là, la chaine pourtant en base en utf-8 ne sort pas en utf-8, par contre, un utf8_encode la convertie bien !
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Non, là, j'ai plus rien en latin dans la table http://prntscr.com/nevq9k
BlackPage Posté 21 Avril 2019 Posté 21 Avril 2019 Salut, commencer par un SET NAMES UTF8 avant ta requete mysql pour dire à mysql que tu veux travailler en utf8 Ensuite, encoder dans la base en ut8_general_ci et pas en latin. Ca devrait aller un peu mieux ensuite.
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 On a de l'utf-8 en entrée (mysql) , on veut de l'utf-8 en sortie, le charset est utf-8, je ne vois vraiment pas pourquoi ça ne marche pas...
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Trop cool, ça marche avec le SET NAMES UTF8 ! Merci à tous !
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Je me suis emballé Là, ce qui sort du select est bien en utf-8, validé par le 'strict ' de Dan. Par contre, dans mon Json, j'ai toujours un encodage pourri, avec par exemple ' Prix r\u00e9duit ' pour 'prix réduit', alors que donc json_encode reçoit bien de l'utf-8... donc on a avancé, mais... pas assez !
Dan Posté 21 Avril 2019 Posté 21 Avril 2019 Tu passes quoi comme option à json_encode ? Essaie ceci : $resultat = json_encode($ta_chaine, JSON_UNESCAPED_UNICODE);
lorik Posté 21 Avril 2019 Auteur Posté 21 Avril 2019 Bingo ! Je ne passais rien, mais là, c'est définitivement ok ! Merci des coups de mains et bon dimanche !
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant