2010-11-02 22 views
18

Comment enregistrer une chaîne codée json avec des caractères internationaux dans la base de données, puis analyser la chaîne décodée dans le navigateur?PHP json_encode json_decode UTF-8

<?php   
    $string = "très agréable"; 
    // to the database 
    $j_encoded = json_encode(utf8_encode($string)); 
    // get from Database 
    $j_decoded = json_decode($j_encoded); 
?>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
    <?= $j_decoded ?> 
</html> 
+0

Quasiment la façon dont vous montrer. Qu'est-ce qui ne fonctionne pas? –

+0

il me donne: très agrà © able – FFish

+0

@FFish est votre fichier PHP enregistrà © en UTF-8? (Habituellement, il y a une sélection dans le "Enregistrer sous .."dialog") est le document servi en UTF-8 Vous pouvez utiliser la balise Meta pour tester: ' –

Répondre

18

Ceci est un problème de codage. Il semble qu'à un certain moment, les données soient représentées comme ISO-8859-1.

Chaque partie de votre processus doit être codée en UTF-8.

  • La connexion de base de données

  • Les tables de base de données

  • Votre fichier PHP (si vous utilisez des caractères spéciaux à l'intérieur de ce fichier comme indiqué dans votre exemple ci-dessus)

  • Le content-type en-têtes que vous affichez

+0

Je pense que c'est la meilleure réponse, j'ai besoin de vérifier mon encodage DB! – FFish

+0

Vous pourriez ajouter le code nécessaire pour accomplir tout cela. –

3
  1. utf8_decode$j_decoded = utf8_decode(json_decode($j_encoded));EDIT ou pour être plus correct $j_encoded = json_encode($j_encoded);$j_decoded = json_decode($j_encoded); pas besoin d'en/décodage UTF8
  2. <meta charset="utf-8" />
+0

Pourquoi aurait-on besoin de 'utf8_decode()' (qui convertit en ISO-8859-1) dans un environnement UTF-8? –

+0

ok, je vois, je dois aussi utf8_decode(). Y at-il une différence à faire utf8_decode (json_decode ($ j_encoded)) vs json_decode (utf8_decode ($ j_encoded) – FFish

+0

oui c'est, et pour être correct, vous ne devriez pas utiliser utf8_encode de toute façon, mais la façon dont vous l'avez utilisé est le poit. 1 vous encoder utf8 puis json pour obtenir votre entrée, vous devez décoder json puis utf8 – teemitzitrone

11

Si votre fichier source est déjà utf8, supprimez les fonctions utf8_ *. Php5 stocke les chaînes sous forme de tableau d'octets.

vous devez ajouter une balise meta pour le codage dans le code HTML ET vous devez ajouter un en-tête http qui définit le codage de transfert à utf-8.

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

et en php

<?php 
header('Content-Type: text/html; charset=utf-8'); 
4

Essayez d'envoyer l'en-tête charset UTF-8:

<?php header ('Content-type: text/html; charset=utf-8'); ?> 

Et le code HTML meta:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
25
header('Content-Type: application/json; charset=utf-8'); 
26

JSON UTF8 encode et decode:

json_encode($data, JSON_UNESCAPED_UNICODE) 

json_decode($json, false, 512, JSON_UNESCAPED_UNICODE) 

UTF8 force pourrait être helpfull aussi: http://pastebin.com/2XKqYU49

+2

pourquoi donner moins? J'ai eu assez de situations où c'est LE seul moyen qui a fonctionné. Ne me dites pas tout ce qui concerne l'encodage du fichier, de la base de données, etc. Il y a des situations où vous ne connaissez pas l'encodage de votre ressource et cela vient au hasard. Certains utf8 un autre que vous pouvez imaginer. –

+2

cela a fonctionné pour moi – Muath

+1

Merci. Cela a fonctionné pour moi. – sj59

0

si vous obtenez l'erreur "de caractère inattendu" vous devriez vérifier s'il y a une nomenclature (Byte Order Marker enregistré dans votre utf -8 json. Vous pouvez supprimer le premier caractère ou enregistrer si vous n'avez pas de nomenclature.

0

travail pour moi :)

function jsonEncodeArray($array){ 
    array_walk_recursive($array, function(&$item) { 
     $item = utf8_encode($item); 
    }); 
    return json_encode($array); 
} 
+0

Merci, cela a montré le chemin pour moi, sauf que ça a empiré les choses au début! :) puis je me suis rendu compte que c'était parce que quelque chose avait évidemment été "sur-encodé" quelque part plus profond dans la pile, donc - peut-être étrangement - en changeant le 'utf8_encode' en' utf8_decode' l'a résolu. – randomsock