Codificación de caracteres JSON: ¿el navegador UTF-8 está bien soportado o debería usar secuencias de escape numéricas?

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 el json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) queda claro que la encoding preferida es utf-8. Pero el rfc también describe un mecanismo de escape de cadena para especificar caracteres. Supongo que esto generalmente se usaría para escapar de caracteres no ascii, por lo que el utf-8 resultante es válido como ascii.

Entonces, digamos que tengo una cadena json que contiene caracteres Unicode (puntos de código) que no son ascii. ¿Debería mi servicio web simplemente utf-8 codificar eso y devolverlo, o debería escapar de todos esos caracteres no ascii y devolver ascii puro?

Me gustaría que los navegadores puedan ejecutar los resultados usando jsonp o eval. ¿Eso afecta la decisión? Mi conocimiento del soporte 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 del navegador de los resultados. Lo que he leído indica que los navegadores pueden ser sensibles a la encoding cuando usan JSONP en particular. No he encontrado ninguna información realmente buena sobre el tema, así que tendré que comenzar a hacer algunas pruebas para ver qué pasa. Idealmente, me gustaría escapar de esos pocos caracteres que son necesarios y solo utf-8 codificar los resultados.

Todos los analizadores JSON pueden manejar el UTF-8 apropiado tan bien como las secuencias de escape numéricas, como lo requiere la especificación JSON.

La capacidad de los codificadores JSON para utilizar las secuencias de escape numéricas en su lugar simplemente le ofrece más opciones. Una razón por la que puede elegir las secuencias de escape numéricas sería si un mecanismo de transporte entre su codificador y el decodificador previsto no es binario seguro.

Otra razón por la que puedes escanear secuencias numéricas es evitar que aparezcan ciertos caracteres en la transmisión, como < , & y " , que pueden interpretarse como secuencias HTML si el código JSON se coloca sin escaparse en HTML o si un navegador lo interpreta erróneamente como HTML Esto puede ser una defensa contra la inyección de HTML o scripts entre sitios (nota: algunos caracteres DEBEN escaparse en JSON, incluidos " y \ ).

Algunos marcos, incluida la implementación de JSON de PHP, siempre realizan las secuencias de escape numérico en el lado del codificador para cualquier carácter que no sea ASCII. Esto está diseñado para una compatibilidad máxima con mecanismos de transporte limitados y similares. Sin embargo, esto no debe interpretarse como una indicación de que los decodificadores JSON tienen un problema con UTF-8.

Entonces, supongo que puedes decidir cuál usar así:

  • Solo use UTF-8, a menos que su método de almacenamiento o transporte entre el codificador y el decodificador no sea binario seguro.

  • De lo contrario, use las secuencias de escape numéricas.

Tuve un problema allí. Cuando I JSON codifica una cadena con un carácter como “é”, cada navegador devolverá el mismo “é”, excepto IE que devolverá “\ u00e9”.

Luego, con PHP json_decode (), fallará si encuentra “é”, entonces 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 están usando json2.js.

ASCII ya no está en eso. El uso de la encoding UTF-8 significa que no está utilizando la encoding ASCII. Para qué deberías usar el mecanismo de escape es lo que dice el RFC:

Todos los caracteres Unicode se pueden colocar entre comillas, excepto los caracteres que se deben escapar: comillas, solidus reverso y los caracteres de control (U + 0000 a U + 001F)

Estaba enfrentando el mismo problema. Esto funciona para mi. Por favor, chequee esto.

 json_encode($array,JSON_UNESCAPED_UNICODE); 

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 si convirtió los datos o no cuando lo cambié, se muestra bien en mysql banco de trabajo. El resultado final es que php no codificará json los datos, simplemente devuelve falso. No importa qué navegador use ya que es el servidor el que causa mi problema, php no analizará los datos en utf8 si este mensaje está presente. Como digo, no estoy seguro de si se debe convertir el esquema a utf8 después de que haya datos o solo un error de php. En este caso, use json_encode(utf8_encode($string));