Jump to content
lorik

Encode json_encode

Rate this topic

Recommended Posts

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 !

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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 !

 

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Trop cool, ça marche avec le SET NAMES UTF8  !

Merci à tous !

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

Tu passes quoi comme option à json_encode ?

Essaie ceci :

$resultat = json_encode($ta_chaine, JSON_UNESCAPED_UNICODE);

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...