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

Résolu/Fermé
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 - 24 août 2010 à 17:12
SebRomeo Messages postés 2 Date d'inscription mardi 21 juin 2016 Statut Membre Dernière intervention 21 juin 2016 - 21 juin 2016 à 16:45
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

canfly Messages postés 14 Date d'inscription dimanche 31 mars 2013 Statut Membre Dernière intervention 1 avril 2013 279
1 avril 2013 à 00:32
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
SebRomeo Messages postés 2 Date d'inscription mardi 21 juin 2016 Statut Membre Dernière intervention 21 juin 2016 3
21 juin 2016 à 16:44
Faux : pour ne pas échapper les caractères en unicode utilisez :

json_encode($comp, JSON_UNESCAPED_UNICODE)

depuis PHP 5.4
1
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
Modifié par Defouille le 24/08/2010 à 17:19
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...
2
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
24 août 2010 à 17:38
merci. tu confirmes ce que je suis en train de regarder.
Le problème est que ma requête récupère plusieurs tous les enregistrement d'une table. donc elle renvoi un tableau.
Y a t il un moyen de convertir tous les string du tableau ? (enfin sans tout parcourir et remplacer?)
0
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
25 août 2010 à 17:02
bonjour

J'ai de nouveau le même problème, mais inversé...
C'est à dire que je peux maintenant lire les données de la base de données. mais lorsque je modifie ces données dans la base de données depuis mon appli web, les accents sont mal enregistrés...
une idée d'ou l'encodage peut 'merd...é'

merci
0
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
25 août 2010 à 17:04
Faut voir en quoi sont enregistré les accents dans ta base, et encoder tes chaines dans cet encodage avant de les enregistrer.

Dans l'idéal tu fais tout en UTF-8, au moins tu te prends pas la tête (mais il faut que ta base soit en UTF-8 aussi)
0
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
25 août 2010 à 17:10
Merci pour cette réponse express.
J'essai justement de tout mettre en utf-8, mais pour l'instant ça ne marche pas.
j'ai ça dans chaque fichier php (de update ou de select
header('Content-Type: text/html; charset=utf-8');

dans les fichiers php 'select' C la solution d'hier
dans les fichiers php 'update' j'ai même rajouté ; $enom = utf8_encode($_POST["nom"]);

les pages haml : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

après il ne reste que la bd (je crois) ou tout (base, table et champ text) sont en "utf8_unicode_ci". est ce le bon?

et ai je oublié quelque chose? merci
0
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
25 août 2010 à 17:13
si tu fais un utf8_encode sur une chaine en utf8, ca va te sortir quelque chose de bizarre :p, ensuite il faut aussi que les données qui sont saisies soient en UTF8, donc toutes tes pages de saisies et de traitements doivent être en utf8.

Pour la base de données utf8_unicode_ci, ça me parait ok.
(A savoir aussi que tout les appels AJAX sont effectués en UTF8, de base)
0
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
1
Lionelpro Messages postés 1 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 29 novembre 2012 1
29 nov. 2012 à 11:38
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
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SebRomeo Messages postés 2 Date d'inscription mardi 21 juin 2016 Statut Membre Dernière intervention 21 juin 2016 3
21 juin 2016 à 16:45
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
1
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
24 août 2010 à 17:58
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 )
0
OConell Messages postés 139 Date d'inscription samedi 1 novembre 2008 Statut Membre Dernière intervention 13 octobre 2010 8
28 août 2010 à 01:05
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 :)
0