2011-06-28 10 views
6

Estoy usando WordPress junto con el complemento de la API JSON (http://wordpress.org/extend/plugins/json-api/) para generar respuestas a nuestro otro sitio.Weird JSON encoding using json_encode

He golpeado un problema muy raro (estamos usando PHP 5.3.6), cuando pase la siguiente matriz http://pastebin.com/xdfYjrvK a json_encode() que me da este (con JSON tipo de contenido): http://pastebin.com/T61XGPP5

Así que la mierda al principio, en el ejemplo anterior es 2609 y 0 al final, cambia dependiendo del tamaño de la respuesta, más contenido -> número hexadecimal más alto. También aparece solo cuando la cantidad de respuesta es "suficientemente alta", por lo que funciona en respuestas pequeñas.

Primero pensé que era el complemento, pero funciona localmente (en dos máquinas diferentes Mac OS X) y hemos actualizado todos los paquetes en el VPS (Debian, Apache, Nginx, PHP) a las últimas versiones.

Sólo se muestra cuando el envío del tipo de contenido, no cuando se da salida el resultado $ con el texto sin formato en lugar de la aplicación/JSON:

$charset = get_option('blog_charset'); 
if (!headers_sent()) { 
    header('HTTP/1.1 200 OK', true); 
    header("Content-Type: application/json; charset=$charset", true); 
} 

echo $result; 

$ charset se establece en UTF-8.

La consola Google Chrome dice: "Recurso interpretado como Documento pero transferido con el tipo MIME application/json".

Entonces, ¿alguien tiene una idea de lo que está sucediendo aquí?

+0

¿Dónde se inicializa $ result? ¿Es un valor json_encode-d? . –

+0

Sí, se trata de otra función que se encarga de la json_encoding con el construido en –

Respuesta

4

Esto se ve como la codificación fragmentada (http://en.wikipedia.org/wiki/Chunked_transfer_encoding). Asegúrese de verificar que sus encabezados estén configurando correctamente el Contenido-Longitud en la respuesta para asegurarse de que no esté forzando al servidor web a usar CTE.

+0

Los encabezados fueron: HTTP/1.1 200 OK Servidor: nginx/0.6.32 Fecha: Mié, 29 de junio de 2011 06:25:53 GMT Tipo de contenido: application/json; charset = UTF-8 Transfer-Encoding: fragmentada conexion: keep-alive X-Powered-By: PHP/5.2.6-1 + lenny10 Ajuste de la longitud de contenido funcionó de maravilla, gracias! –

+0

tuvo el mismo problema, con nginx aswell ... muchas gracias, esto me ahorró un montón de problemas – skiplecariboo

0

Una JSON requisito es que tenga todos los datos que le das a que debe ser codificación UTF-8. json_encode() no lo hace de forma automática. Entonces puede intentar ejecutar este array_map("utf8_encode", $array); antes de json_encode it.

Else ... Se ve raro, así que estoy adivinando ...

+0

Todos los datos ya están codificación UTF-8 –