2011-10-10 15 views
1

Je stocke une chaîne json contenant des caractères (chinois?) Dans une base de données mysql. Exemple de ce qui est dans la base de données:Php/json: décode utf8?

normal.text.\u8bf1\u60d1.rest.of.text 

Sur ma page PHP, je fais juste un json_decode de ce que je reçois de MySQL, mais il n'affiche pas juste, il montre des choses comme « ½ ± è§ »

J'ai essayé d'exécuter la requête "SET NAMES 'utf8'" au début de mon fichier, n'a rien changé. J'ai déjà l'en-tête suivant sur ma page Web:

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

Et bien sûr, tous mes fichiers php sont codés en UTF-8.

Avez-vous une idée de comment afficher ces caractères "\ uXXXX"?

+0

Est-ce les caractères qui doivent être affichées: 诱惑? –

+0

Montrez-nous plus de ce que vous faites exactement. 'echo json_decode ('" \ u8bf1 \ u60d1 "');' devrait faire le tour parfaitement bien. – deceze

Répondre

3

Unicode n'est pas UTF-8!

$ echo -en '\x8b\xf1\x60\xd1\x00\n' | iconv -f unicodebig -t utf-8 
诱惑 

Ceci est un étrange "encodage" que vous avez. Je suppose que chaque caractère du texte normal est long d'un octet (US-ASCII)? Ensuite, vous devez extraire les séquences \ u ...., convertir la séquence en un caractère "deux octets" et convertir ce caractère avec iconv("unicodebig", "utf-8", $character) en un caractère UTF-8 (voir iconv dans la documentation PHP). Cela a fonctionné de mon côté:

$in = "normal.text.\u8bf1\u60d1.rest.of.text"; 

function ewchar_to_utf8($matches) { 
    $ewchar = $matches[1]; 
    $binwchar = hexdec($ewchar); 
    $wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF); 
    return iconv("unicodebig", "utf-8", $wchar); 
} 

function special_unicode_to_utf8($str) { 
    return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str); 
} 

echo special_unicode_to_utf8($in); 

Sinon, nous avons besoin de plus d'informations sur la façon dont votre chaîne dans la base de données est codée.

+0

Merci beaucoup, ça a marché! – Quentin

+1

L'encodage est le résultat de 'json_encode()' (ou d'un autre encodeur compatible), 'json_decode()' devrait suffire à le convertir. –

+0

@therefromhere: vous avez probablement raison, mais la sortie de l'encodeur JSON ne devrait-elle pas être valide Javascript? Parce que les guillemets (") manquent de texte juste et pas vraiment JSON.Une partie de cela, de mon côté' json_decode' imprime également le résultat correct, tout comme dans votre réponse – vstm

2

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

C'est un faux problème. Si vous diffusez votre page sur http et que la réponse contient un en-tête Content-Type, la balise meta sera ignorée. Par défaut, PHP va définir un tel en-tête, si vous ne le faites pas explicitement. Et la valeur par défaut est iso-8859-1.

Essayez avec cette ligne:

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
+0

N'a rien changé. Aussi, je dois mentionner que Firefox dit que la page est en UTF8 donc je suppose que les en-têtes sont déjà bons? – Quentin

8

Cela semble fonctionner très bien pour moi, avec PHP 5.3.5 sur Ubuntu 11.04:

<?php 
header('Content-Type: text/plain; charset="UTF-8"'); 
$json = '[ "normal.text.\u8bf1\u60d1.rest.of.text" ]'; 

$decoded = json_decode($json, true); 

var_dump($decoded); 

Sorties ceci:

array(1) { 
    [0]=> 
    string(31) "normal.text.诱惑.rest.of.text" 
}