2009-01-04 24 views
12

Estoy intentando codificar la matriz Cyrillic UTF-8 en una cadena JSON utilizando la función json_encode de php. El código de ejemplo es el siguiente:Caracteres cirílicos en json_encode de PHP

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

Funciona bien, pero el resultado de la secuencia de comandos se representa como:

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

que hace 6 caracteres para cada carácter cirílico. ¿Hay alguna manera de obtener los caracteres originales para los pares clave/valor en lugar de los codificados?

+0

Como eco de la cadena, que supongo que wents en una respuesta HTTP.¿Qué codificación usa esa respuesta? Para codificaciones de caracteres válidas, consulte también http://json.org/. – hakre

+0

intente esto $ str = json_encode ($ json, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE); –

Respuesta

2

Parece que PHP's construido en json_encode solo funciona con UTF-8, y no hay otras opciones para ajustar cómo funciona con respecto a la codificación.

Encontré A completely fair and balanced comparison of php json libraries en Google. Puede ser que te ayude. Puede probar otra biblioteca basada en las tablas aquí, si es posible. Hay bibliotecas PHP adicionales enumeradas en json.org con las que puede experimentar.

2

Se trabajó con http://pear.php.net/pepr/pepr-proposal-show.php?id=198

Con derivación desagradable en JSON.php, filas 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; 

Gracias!

+0

¿Cómo se enteró de ese bypass? –

+0

Me lo imaginé solo. Era obvio – AquilaX

10

He encontrado esto en el código de Zend Framework:

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

Tome un vistazo a la decodeUnicodeString función (línea 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) 

Es estático, y se puede extraer fácilmente simplemente reemplace la línea:

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

con:

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

No es una solución ideal, pero no el trabajo para mí: o)

11

¿No puedes usar constante JSON_UNESCAPED_UNICODE aquí?

+0

Esto se produce en php 5.4.0. Parece que debería funcionar, pero aún no puede confirmarlo. – AquilaX

1

Tenía el mismo problema para el turco ... de hecho no tenemos que hacer nada, los navegadores los convierten automáticamente en bloques de código JS. Entonces, la manera más fácil de lograr que se descodifiquen es haciendo que pasen por javascript. (Ajax, etc ...)

Json encode for with non ascii characters ?

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

El uso de esta solución funcionó para mí con el latín y el alfabeto cirílico, con PHP 5.5

0

Ésta es una cuestión de edad realmente, pero No creo que se haya respondido correctamente.

uso algo como esto:

print json_encode($array, JSON_UNESCAPED_UNICODE); 
+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/15286151) – rahulsm

+0

@rahul_m ¿Dónde está el enlace aquí? –

+0

No encuentro una categoría relevante para esta respuesta, por lo que hice un mapa de esta categoría. – rahulsm

Cuestiones relacionadas