Pb json_encode (php) et caractères accentués [Résolu/Fermé]

Signaler
Messages postés
139
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
13 octobre 2010
-
Messages postés
2
Date d'inscription
mardi 21 juin 2016
Statut
Membre
Dernière intervention
21 juin 2016
-
Bonjour,

Je réalise une appli web qui communique avec une bdd. Tout ce que je fais depuis mon appli fonctionne, mais cette bdd et utilisé par une autre appli java.

Le problème vient de la récupération des données de la bdd qui ne sont créer au chargement de l'appli java (par copie d'une table d'initialisation dans la table courante).

Je récupère toutes les données en php (utilisation de PDO sur base myssql) et j'utilise la fonction json_encode. C'est là que ça plante. tous les champs où il y a un caractères avec accents est remplacé par null.

SI vous avez des idées merci...

-------------------------------------------------------------------------------------
... // fichier connexion.php
try {
$bdd = new PDO("mysql:host=$hote;dbname=$nombd", $login, $mdp);
}catch (Exception $e){ die(''); }
...

//fichier php
<?php
header('Content-Type: text/html; charset=utf-8');
//header("Content-Type: text/plain"); //test
//header('content-type: text/html; '); // test
//header('content-type: text/html; charset=utf-8'); //test

require('connexion.php');
$rows = array();
try
{
$stmt = $bdd->prepare('Select usl_id, usl_nom, usl_type, usl_lati, usl_longi, usl_descri FROM usl');
$stmt->execute();

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo utf8_decode($rows[0]['usl_nom']); // -> oK
echo "\n <br/>";
echo utf8_decode(json_encode($rows)); // -> les champs avec char accentués = null
$stmt->closeCursor();
}
catch (Exception $e)
{
die("erreur");
}

?>
-------------------------------------------------------------------------------------

7 réponses

Messages postés
14
Date d'inscription
dimanche 31 mars 2013
Statut
Membre
Dernière intervention
1 avril 2013
278
La fonction json_encode de PHP ne travaille qu'en UTF-8, donc il faut que tout soit en UTF-8 : script PHP, variables de type "string" manipulées, mais aussi headers HTTP.
Cf ce tuto :
http://www.finalclap.com/faq/60-php-debug-json
4
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 61649 internautes nous ont dit merci ce mois-ci

Messages postés
2
Date d'inscription
mardi 21 juin 2016
Statut
Membre
Dernière intervention
21 juin 2016
1
Faux : pour ne pas échapper les caractères en unicode utilisez :

json_encode($comp, JSON_UNESCAPED_UNICODE)

depuis PHP 5.4
Messages postés
388
Date d'inscription
mercredi 13 janvier 2010
Statut
Membre
Dernière intervention
15 novembre 2011
52
Bonjour,
le problème vient de l'encodage, json_encode n'aime pas trop l'iso :p

si tu connais les champs qui peuvent être accentués, tu mets un utf8_encode avant de le "json encodé", sinon tu te débrouille pour récupérer les données de ta base en UTF8.

utf8_encode :
https://www.php.net/manual/en/function.utf8-encode.php

Il y a seulement 10 types de personnes, ceux qui comprennent le binaire, et les autres...
>
Messages postés
139
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
13 octobre 2010

Merci OConell ça marche avec moi
Messages postés
388
Date d'inscription
mercredi 13 janvier 2010
Statut
Membre
Dernière intervention
15 novembre 2011
52
Si ta base est en utf8, pas besoin de faire un utf8_encode de ce que tu récupères, sinon ça va l'encoder dans quelque chose que tu ne veux pas (et en plus un truc qui existe pas, 2xUTF8 !)
Messages postés
139
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
13 octobre 2010
8
Mais le problème ne viens pas de la... quand ma base est en utf8_unicode_ci, je peut récupérer mes données en faisant le utf8_encode (sans le json_encode ne marche pas) mais le problème vient de l'enregistrement... ça m'enregistre toujours mal les accents...
J'arrive à afficher soit les données créées depuis la base, soit les données créées depuis l'appli web...
Messages postés
388
Date d'inscription
mercredi 13 janvier 2010
Statut
Membre
Dernière intervention
15 novembre 2011
52
Si lorsque tu crées des données dans ta base, et avec le code avec les encode_utf8, tu arrives à les voir correctement, c'est que les données de ta base ne sont pas en utf8.

Enfin je persiste à dire qu'aucun utf8_encode ou utf8_decode n'est nécessaire si tu à toute tes pages ainsi que ta base en UTF8.
Merci pour l'astuce UTF_encode à l'intérieur de la boucle While ça marche bien :)
Et bien, c est vraiment bizzare cette histoire !
je me suis retrouvé confronté au meme probleme.
et toute la base est en utf-8 !
le json_encode ne prenai pas mes lignes avec des caractères accentués, et paf, en mettant juste utf8_encode au remplissage de mon tableau, ca fonctionne !
j aurai tendance à penser comme Defouille, si la base est en utf8, pas besoin d utf8_encode... mais bon...
c est chouette, ca marche, mais la base étant en utf8, j'aimerai bien comprendre pourquoi il me faut ce utf8_encode pour que ca fonctionne!
si quelqu'un peu m'éclairer ! ;)
merci
Messages postés
1
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
29 novembre 2012
1
Même si votre base de données et entièrement utf8
json_encode renverra ce type de caractères '\u00e9' pour les caractères accentués

C'est normal et le JavaScript saura l'interpréter correctement:

Voir ce lien:
http://code18.blogspot.com/2009/01/convertir-un-objet-php-en-json.html
Messages postés
139
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
13 octobre 2010
8
Merci Defouille

bon si il existe une fonction pour convertir tous les string de mon $rows je suis preneur, sinon :
//php
...
header('Content-Type: text/html; charset=utf-8');
...

for($i=0;$i<sizeof($rows);$i++)
{
$rows[$i]['usl_nom'] = utf8_encode($rows[$i]['usl_nom']);
// rajouter une ligne par champs texte
}


//html - sur la page qui utilise le JS
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


et ça marche (enfin, une fois envoyé au Javascript sinon les 'é' sont remplacé par \u00e9 )
Messages postés
139
Date d'inscription
samedi 1 novembre 2008
Statut
Membre
Dernière intervention
13 octobre 2010
8
J'ai donc enfin trouvé une solution qui marche pour une base en utf8_unicode_ci ou latin1_swedish_ci.

en tete html :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

javascript - envoi de la requete :
var xhr = getXMLHttpRequest();
...
xhr.open("POST", "file.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(...);

fichier php :
1 - pour un enregistrement
$enom = utf8_decode($_POST["nom"]); //récupération des variables POST ou GET avec le utf8_decode pour les champs texte
... //toujours tester les variables, connexio, requete (avec pdo pour moi)...

2- pour une récupération de champ texte (les bool int... traité normalement)
.. //récupération de l'id si un seul élément et tests
// requete toujours avec PDO
$stmt = $bdd->prepare(...);
$stmt->execute(array('id' => $eid)); // sans le array si pas d'id

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // récupération du résultat de la requete

mb_detect_encoding($rows[$i]['usl_nom'], "UTF-8") != "UTF-8" ? : $rows[$i]['usl_nom'] = utf8_encode($rows[$i]['usl_nom']); // encodage des champs texte en utf8 si il ne le sont pas.

echo json_encode($rows); // envoi des données encodé en json au JS

javascript - après retour de la requete :
var donnees = JSON.parse(xhr.response);

Encore merci Defouille pour ton aide et ton soutient :)
Messages postés
2
Date d'inscription
mardi 21 juin 2016
Statut
Membre
Dernière intervention
21 juin 2016
1
Pour ne pas échapper les caractères en unicode utilisez :

json_encode($comp, JSON_UNESCAPED_UNICODE);

JSON_UNESCAPED_UNICODE est un paramètre optionnel de json_encode depuis PHP 5.4