Aller au contenu

Encode json_encode


Sujets conseillés

Posté

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 !

Posté

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

 

Posté

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) !

 

 

Posté

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
?>

 

Posté

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 !

 

Posté

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 !

Posté

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.

Posté

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...

Posté

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 !

Posté

Tu passes quoi comme option à json_encode ?

Essaie ceci :

$resultat = json_encode($ta_chaine, JSON_UNESCAPED_UNICODE);

 

Posté

Bingo ! Je ne passais rien, mais là, c'est définitivement ok !
Merci des coups de mains  et bon dimanche !

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...