2009-01-04 5 views
12

J'essaye d'encoder le tableau UTF-8 cyrillique en chaîne JSON en utilisant la fonction json_encode de php. L'exemple de code ressemble à ceci:Caractères cyrilliques dans le json_encode de PHP

<?php 
    $arr = array(
    'едно' => 'първи', 
    'две' => 'втори' 
); 
    $str = json_encode($arr); 
    echo $str; 
?> 

Il fonctionne très bien, mais le résultat du script est représenté comme:

{"\u0435\u0434\u043d\u043e":"\u043f\u044a\u0440\u0432\u0438","\u0434\u0432\u0435":"\u0432\u0442\u043e\u0440\u0438"} 

qui fait 6 caractères pour chaque caractère cyrillique. Existe-t-il un moyen d'obtenir les caractères d'origine pour les paires clé/valeur plutôt que celles codées?

+0

Comme vous l'écho de la chaîne, je suppose que ce Wents dans une réponse HTTP.Quel encodage utilise cette réponse? Pour les codages de caractères valides, veuillez consulter aussi http://json.org/. – hakre

+0

Salut essayez ce $ str = json_encode ($ json, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE); –

Répondre

2

Il semble que PHP json_encode intégré fonctionne uniquement avec UTF-8, et aucun autre gadget pour modifier son fonctionnement en ce qui concerne l'encodage. J'ai trouvé A completely fair and balanced comparison of php json libraries sur Google. Cela pourrait vous aider. Vous pouvez essayer une autre bibliothèque basée sur les tables ici, si possible. Il existe d'autres bibliothèques PHP répertoriées au json.org que vous pouvez tester.

2

Il a collaboré avec http://pear.php.net/pepr/pepr-proposal-show.php?id=198

avec by-pass méchant dans json.php, les lignes 298 ..

$char = pack('C*', $ord_var_c, ord($var{$c + 1})); 
$c += 1; 
//$utf16 = $this->utf82utf16($char); 
//$ascii .= sprintf('\u%04s', bin2hex($utf16)); 
$ascii .= $char; 

Merci!

+0

Comment avez-vous entendu parler de ce contournement? –

+0

Je l'ai imaginé par moi-même. C'était évident – AquilaX

10

Je trouve cela dans le code de Zend Framework:

http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php

Jetez un oeil à la fonction decodeUnicodeString (ligne 474):

/** 
    * Decode Unicode Characters from \u0000 ASCII syntax. 
    * 
    * This algorithm was originally developed for the 
    * Solar Framework by Paul M. Jones 
    * 
    * @link http://solarphp.com/ 
    * @link http://svn.solarphp.com/core/trunk/Solar/Json.php 
    * @param string $value 
    * @return string 
    */ 
    public static function decodeUnicodeString($chrs) 

Il est statique, et vous pouvez facilement extraire il - il suffit de remplacer la ligne:

490:   $utf8 .= self::_utf162utf8($utf16); 

avec:

490:   $utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); 

pas une solution idéale, mais ne le travail pour moi: o)

11

Tu ne peux pas utiliser JSON_UNESCAPED_UNICODE ici constante?

+0

Ceci est produit en PHP 5.4.0. On dirait que cela devrait fonctionner, mais ne peut toujours pas confirmer. – AquilaX

1

J'ai eu le même problème pour le turc ... en effet, nous n'avons pas à faire quoi que ce soit les navigateurs les convertit automatiquement en blocs de code JS. Donc, la façon la plus simple de les décoder est de les faire passer en javascript. (Ajax, etc ...)

Json encode for with non ascii characters ?

2
$str = json_encode($arr, JSON_UNESCAPED_UNICODE); 

L'utilisation de cette solution a fonctionné pour moi avec le latin et l'alphabet cyrillique, avec PHP 5.5

0

C'est une question ancienne realy, mais Je ne pense pas qu'il a été répondu correctement.

utiliser quelque chose comme ceci:

print json_encode($array, JSON_UNESCAPED_UNICODE); 
+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [À revoir] (/ review/low-quality-posts/15286151) – rahulsm

+0

@rahul_m où est le lien ici? –

+0

Je ne trouve pas de catégorie pertinente pour cette réponse, donc j'ai mappé avec cette catégorie. – rahulsm

Questions connexes