php - json_encode - json_unescaped_unicode
Caracteres cirílicos en json_encode de PHP (7)
Funcionó con http://pear.php.net/pepr/pepr-proposal-show.php?id=198
Con desagradable puente 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!
Estoy intentando codificar la matriz Cyrillic UTF-8 en una cadena JSON utilizando la función json_encode de php. El código de muestra se ve así:
<?php
$arr = array(
''едно'' => ''първи'',
''две'' => ''втори''
);
$str = json_encode($arr);
echo $str;
?>
Funciona bien, pero el resultado del script 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?
Parece que PHP está construido en json_encode solo funciona con UTF-8, y no hay otras cosas para ajustar cómo funciona con respecto a la codificación.
Encontré una comparación completamente justa y equilibrada de las bibliotecas de php json 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 puedes experimentar.
Encontré esto en el código de Zend framework:
http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php
Eche un vistazo a la función decodeUnicodeString (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 puedes extraerlo fácilmente, simplemente reemplaza 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 hizo el trabajo por mí: o)
¿No puedes usar la constante JSON_UNESCAPED_UNICODE aquí?
$str = json_encode($arr, JSON_UNESCAPED_UNICODE);
El uso de esta solución funcionó para mí con el alfabeto latino y cirílico, con PHP 5.5
Esta es una pregunta muy antigua, pero no creo que haya sido respondida correctamente.
usa algo como esto:
print json_encode($array, JSON_UNESCAPED_UNICODE);
Estaba lidiando con el mismo problema para los turcos ... 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.)