2010-11-15 12 views
20

A continuación se muestra el programa de prueba, incluyendo un carácter chino:python: json.dumps no puede manejar utf-8?

# -*- coding: utf-8 -*- 
import json 

j = {"d":"中", "e":"a"} 
json = json.dumps(j, encoding="utf-8") 

print json 

A continuación se muestra el resultado, se ven las json.dumps convierten el UTF-8 a los números originales!

{"e": "a", "d": "\u4e2d"} 

¿Por qué esto está roto? O todo lo que estoy mal?

+8

en primer lugar: el nombre de su __don't var json__ usted no será capaz de acceder lib JSON más después de eso, en segundo lugar, nada está roto, además de que la codificación json predeterminada es utf-8, por lo que no es necesario agregarla en dumps() args. – mouad

+0

si puedo aceptar que convierta datos binarios utf-8 en "\ u4e2d", ¿cómo puedo convertirlo de nuevo a binario utf-8 en el javascript, que es el cliente que recibe estos datos? –

+0

¿lo intentas?, Me refiero a enviarlo así al navegador, creo que si estás utilizando una sofisticada javascript lib, sabrá qué hacer con él. – mouad

Respuesta

27

Debe leer json.org. La especificación JSON completa está en el recuadro blanco de la derecha.

No hay nada de malo con el JSON generado. Los generadores pueden generar cadenas UTF-8 o cadenas simples ASCII, donde los caracteres se escapan con la notación \uXXXX. En su caso, el módulo Python json decidió escapar, y tiene la notación escapada \u4e2d.

Dicho sea de paso: Cualquier intérprete JSON conforme realizará correctamente el desbloqueo de esta secuencia nuevamente y le devolverá el carácter real.

58

Parece el JSON válido para mí. Si desea que json muestre una cadena que tenga caracteres que no sean ASCII, deberá pasar ensure_ascii=False y luego codificar manualmente después.

+2

¡Esta es la respuesta que me ayudó! – borrrden

+1

Documentación: http://docs.python.org/2/library/json.html#basic-usage –

5

Uso simplejson con las opciones mencionadas:

# -*- coding: utf-8 -*- 
import simplejson as json 

j = {"d":"中", "e":"a"} 
json = json.dumps(j, ensure_ascii=False, encoding="utf-8") 

print json 

Salidas:

{"e": "a", "d": "中"} 
Cuestiones relacionadas