Posez votre question Signaler

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

OConell 118Messages postés 1 novembre 2008Date d'inscription 13 octobre 2010Dernière intervention - Dernière réponse le 19 janv. 2012 à 10:40
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");
}
?>
-------------------------------------------------------------------------------------
Lire la suite 

Pb json_encode (php) et caractères accentués »

13 réponses
Réponse
+1
moins plus
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 :
http://fr.php.net/manual/en/function.utf8-encode.php

Defouille- 26 août 2010 à 08:42
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 !)
OConell- 27 août 2010 à 11:01
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...
Defouille- 27 août 2010 à 11:07
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.
Ajouter un commentaire
Réponse
+1
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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 )
Ajouter un commentaire
Réponse
+0
moins plus
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 :)
Ajouter un commentaire
Ce document intitulé « pb json_encode (php) et caractères accentués » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?