Estoy escribiendo un servicio web que usa json para representar sus recursos, y estoy un poco atascado pensando en la mejor manera de codificar el json. Al leer json rfc ( http://www.ietf.org/rfc/rfc4627.txt ), queda claro que la codificación preferida es utf-8. Pero el rfc también describe un mecanismo de escape de cadenas para especificar caracteres. Supongo que esto generalmente se usaría para escapar de caracteres no ascii, lo que haría que el utf-8 resultante fuera ascii válido.
Entonces, digamos que tengo una cadena json que contiene caracteres Unicode (puntos de código) que no son ASCII. ¿Mi servicio web debería codificarlo en utf-8 y devolverlo, o debería escapar de todos esos caracteres que no son ascii y devolver ascii puro?
Me gustaría que los navegadores pudieran ejecutar los resultados usando jsonp o eval. ¿Eso afecta la decisión? Mi conocimiento de la compatibilidad con JavaScript de varios navegadores para utf-8 es deficiente.
EDITAR: Quería aclarar que mi principal preocupación sobre cómo codificar los resultados es realmente sobre el manejo de los resultados por parte del navegador. Lo que he leído indica que los navegadores pueden ser sensibles a la codificación cuando usan JSONP en particular. No he encontrado ninguna información realmente buena sobre el tema, así que tendré que empezar a hacer algunas pruebas para ver qué sucede. Idealmente, me gustaría escapar solo de esos pocos caracteres que se requieren y solo utf-8 codificar los resultados.
fuente
Tuve un problema ahí. Cuando codifico JSON una cadena con un carácter como "é", todos los navegadores devolverán la misma "é", excepto IE, que devolverá "\ u00e9".
Luego, con PHP json_decode (), fallará si encuentra "é", así que para Firefox, Opera, Safari y Chrome, tengo que llamar a utf8_encode () antes de json_decode ().
Nota: con mis pruebas, IE y Firefox están usando su objeto JSON nativo, otros navegadores usan json2.js.
fuente
utf8_encode()
, php.net/manual/en/function.utf8-encode.phpASCII ya no está en él. Usar codificación UTF-8 significa que no está usando codificación ASCII. Para lo que debe usar el mecanismo de escape es para lo que dice el RFC:
fuente
Estaba enfrentando el mismo problema. Esto funciona para mi. Por favor, chequee esto.
json_encode($array,JSON_UNESCAPED_UNICODE);
fuente
Para su información, RFC 4627 ya no es la especificación oficial de JSON. Fue obsoleto en 2014 por RFC 7159 , que luego quedó obsoleto en 2017 por RFC 8259 , que es la especificación actual.
RFC 8259 establece:
fuente
Tuve un problema similar con é char ... Creo que el comentario "es posible que el texto que estás alimentando no sea UTF-8" probablemente esté cerca de la marca aquí. Tengo la sensación de que la intercalación predeterminada en mi instancia era otra cosa hasta que me di cuenta y cambié a utf8 ... el problema es que los datos ya estaban allí, así que no estoy seguro de si convirtió los datos o no cuando los cambié, se muestra bien en mysql banco de trabajo. El resultado final es que php no codificará los datos con json, solo devuelve falso. No importa qué navegador use, ya que es el servidor que causa mi problema, php no analizará los datos en utf8 si este carácter está presente. Como digo, no estoy seguro si se debe a la conversión del esquema a utf8 después de que los datos estaban presentes o simplemente a un error de php. En este caso utilice
json_encode(utf8_encode($string));
fuente