Código de muestra:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
El problema: no es legible para humanos. Mis usuarios (inteligentes) quieren verificar o incluso editar archivos de texto con volcados JSON (y prefiero no usar XML).
¿Hay alguna manera de serializar objetos en cadenas JSON UTF-8 (en lugar de \uXXXX
)?
Respuestas:
Use el
ensure_ascii=False
interruptor parajson.dumps()
, luego codifique el valor en UTF-8 manualmente:Si está escribiendo en un archivo, simplemente utilícelo
json.dump()
y déjelo al objeto de archivo para codificar:Advertencias para Python 2
Para Python 2, hay algunas advertencias más a tener en cuenta. Si está escribiendo esto en un archivo, puede usarlo en
io.open()
lugar deopen()
producir un objeto de archivo que codifique valores Unicode para usted a medida que escribe, luego usejson.dump()
en su lugar para escribir en ese archivo:Tenga en cuenta que hay un error en el
json
módulo donde laensure_ascii=False
bandera puede producir una mezcla deunicode
ystr
objetos. La solución para Python 2 es:En Python 2, cuando use cadenas de bytes (escriba
str
), codificadas en UTF-8, asegúrese de establecer también laencoding
palabra clave:fuente
Para escribir en un archivo
Para imprimir en stdout
fuente
codecs
biblioteca. ¡Gracias!ACTUALIZACIÓN: Esta es una respuesta incorrecta, pero sigue siendo útil entender por qué está mal. Ver comentarios.
¿Qué tal
unicode-escape
?fuente
unicode-escape
no es necesario: podría usarlojson.dumps(d, ensure_ascii=False).encode('utf8')
en su lugar. Y no está garantizado que json use exactamente las mismas reglas que elunicode-escape
códec en Python en todos los casos, es decir, el resultado puede o no ser el mismo en algunos casos de esquina. El voto negativo es para una conversión innecesaria y posiblemente incorrecta. Sin relación:print json_str
funciona solo para entornos locales utf8 o siPYTHONIOENCODING
envvar especifica utf8 aquí (imprima Unicode en su lugar).json.dumps(d, ensure_ascii=False).encode('utf8')
no funciona, al menos para mí. Me estoy poniendo elUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
error. Launicode-escape
variante funciona bien sin embargo.La solución de Python 2 de Peters falla en un caso límite:
Estaba fallando en la parte .decode ('utf8') de la línea 3. Solucioné el problema al simplificar mucho el programa al evitar ese paso y la carcasa especial de ascii:
fuente
unicode(data)
enfoque es la mejor opción en lugar de utilizar el manejo de excepciones. Tenga en cuenta que elencoding='utf8'
argumento de la palabra clave no tiene nada que ver con la salida quejson.dumps()
produce; se usa para decodificar lastr
entrada que recibe la función.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
funciona tanto sidumps
devuelve (ascii-only) str o unicode object.str.encode('utf8')
decodifica implícitamente primero. Pero también lo haceunicode(data)
, si se le da unstr
objeto. :-) Sinio.open()
embargo, el uso le brinda más opciones, incluido el uso de un códec que escribe una lista de materiales y está siguiendo los datos JSON con otra cosa..encode('utf8')
variante basada en funciona tanto en Python 2 como en 3 (el mismo código). No hayunicode
en Python 3. Sin relación: los archivos json no deben usar BOM (aunque un analizador json confirmador puede ignorar BOM, ver error 3983 ).encoding='utf8'
ajson.dumps
resuelve el problema. PD: Tengo un texto cirílico para descargarA partir de Python 3.7, el siguiente código funciona bien:
Salida:
fuente
Lo siguiente es mi comprensión de la respuesta de lectura var anterior y google.
fuente
Aquí está mi solución usando json.dump ():
donde SYSTEM_ENCODING se establece en:
fuente
Use códecs si es posible,
fuente
Gracias por la respuesta original aquí. Con python 3 la siguiente línea de código:
estaba bien. Considere intentar no escribir demasiado texto en el código si no es imprescindible.
Esto podría ser lo suficientemente bueno para la consola de Python. Sin embargo, para satisfacer un servidor, es posible que deba establecer la configuración regional como se explica aquí (si está en apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
básicamente instale he_IL o cualquier idioma en ubuntu, verifique que no esté instalado
instálalo donde XX es tu idioma
Por ejemplo:
agregue el siguiente texto a / etc / apache2 / envvrs
Esperamos que no aparezcan errores de Python desde Apache como:
También en apache intente hacer utf la codificación predeterminada como se explica aquí:
¿Cómo cambiar la codificación predeterminada a UTF-8 para Apache?
Hágalo temprano porque los errores de apache pueden ser difíciles de depurar y puede pensar erróneamente que es de Python, que posiblemente no sea el caso en esa situación
fuente
Si está cargando una cadena JSON desde un archivo y contenido de archivo de textos árabes. Entonces esto funcionará.
Asumir archivo como: arabic.json
Obtenga el contenido árabe del archivo arabic.json
Para usar datos JSON en la plantilla de Django, siga los pasos a continuación:
fuente
fh.close()
fh
es indefinido.f.close()
use unicode-escape para resolver el problema
explique
recurso original: https://blog.csdn.net/chuatony/article/details/72628868
fuente
El uso de sure_ascii = False en json.dumps es la dirección correcta para resolver este problema, como señaló Martijn. Sin embargo, esto puede generar una excepción:
Necesita configuraciones adicionales en site.py o sitecustomize.py para configurar su sys.getdefaultencoding () correctamente. site.py está bajo lib / python2.7 / y sitecustomize.py está bajo lib / python2.7 / site-packages.
Si desea usar site.py, en def setencoding (): cambie el primer if 0: a if 1: para que python use la configuración regional de su sistema operativo.
Si prefiere usar sitecustomize.py, que puede no existir si no lo ha creado. simplemente pon estas líneas:
Luego puede hacer algo de salida json china en formato utf-8, como:
Obtendrá una cadena codificada utf-8, en lugar de una cadena json escapada.
Para verificar su codificación predeterminada:
Debería obtener "utf-8" o "UTF-8" para verificar su configuración de site.py o sitecustomize.py.
Tenga en cuenta que no puede hacer sys.setdefaultencoding ("utf-8") en la consola interactiva de Python.
fuente
json
'sensure_ascii=False
. Proporcione un ejemplo de código completo mínimo si piensa lo contrario.