unicodeencodeerror language_code language def code python django unicode formatting

python - language_code - No se puede codificar/decodificar la salida de pprint



unicode python 3 (2)

Esta pregunta se basa en un efecto secundario de esa .

Mis archivos .py tienen # -*- coding: utf-8 -*- definidor de codificación en la primera línea, como mi api.py

Como menciono en la pregunta relacionada, utilizo HttpResponse para devolver la documentación de la API. Desde que definí la codificación por:

HttpResponse(cy_content, content_type=''text/plain; charset=utf-8'')

Todo está bien, y cuando llamo a mi servicio API, no hay problemas de codificación, excepto la cadena formada a partir de un diccionario por pprint

Como uso caracteres turcos en algunos valores de mi dict, pprint los convierte en equivalentes unichr , como:

API_STATUS = { 1: ''müşteri'', 2: ''some other status message'' } my_str = ''Here is the documentation part that contains Turkish chars like işüğçö'' my_str += pprint.pformat(API_STATUS, indent=4, width=1) return HttpRespopnse(my_str, content_type=''text/plain; charset=utf-8'')

Y mi salida de texto sin formato es como:

Here is the documentation part that contains Turkish chars like işüğçö { 1: ''m/xc3/xbc/xc5/x9fteri'', 2: ''some other status message'' }

Intento descodificar o codificar la salida de pprint a diferentes codificaciones, sin éxito ... ¿Cuál es la mejor práctica para superar este problema?


pprint parece usar repr de forma predeterminada, puede PrettyPrinter.format esto anulando PrettyPrinter.format :

# coding=utf8 import pprint class MyPrettyPrinter(pprint.PrettyPrinter): def format(self, object, context, maxlevels, level): if isinstance(object, unicode): return (object.encode(''utf8''), True, False) return pprint.PrettyPrinter.format(self, object, context, maxlevels, level) d = {''foo'': u''işüğçö''} pprint.pprint(d) # {''foo'': u''i/u015f/xfc/u011f/xe7/xf6''} MyPrettyPrinter().pprint(d) # {''foo'': işüğçö}


Deberías usar cadenas Unicode en lugar de cadenas de 8 bits:

API_STATUS = { 1: u''müşteri'', 2: u''some other status message'' } my_str = u''Here is the documentation part that contains Turkish chars like işüğçö'' my_str += pprint.pformat(API_STATUS, indent=4, width=1)

El módulo pprint está diseñado para imprimir todo tipo posible de estructura anidada de forma legible. Para hacerlo, imprimirá la representación de los objetos en lugar de convertirla en una cadena, de modo que terminará con la sintaxis de escape cuando use cadenas de caracteres unicode o no. ¡Pero si está usando unicode en su documento, entonces realmente debería usar literales unicode!

De todos modos, thg435 te ha dado una solución sobre cómo cambiar este comportamiento de pformat.