xe9 - unicodeencodeerror python




Impossible d'encoder/décoder la sortie pprint (2)

Cette question est basée sur un effet secondaire de celui-là .

Mes fichiers .py ont tous le # -*- coding: utf-8 -*- définition de l'encodage sur la première ligne, comme mon api.py

Comme je le mentionne sur la question connexe, j'utilise HttpResponse pour renvoyer la documentation api. Depuis que j'ai défini l'encodage par:

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

Tout est ok, et quand j'appelle mon service API, il n'y a pas de problèmes d'encodage sauf la chaîne formée d'un dictionnaire par pprint

Comme j'utilise des caractères turcs dans certaines valeurs de mon dict, pprint les convertit en équivalents unichr , comme:

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')

Et la sortie de mon texte brut est comme:

Here is the documentation part that contains Turkish chars like işüğçö

{
    1: 'm\xc3\xbc\xc5\x9fteri',
    2: 'some other status message'
}

J'essaie de décoder ou d'encoder la sortie pprint vers différents encodages, sans succès ... Quelle est la meilleure pratique pour résoudre ce problème?


pprint semble utiliser repr par défaut, vous pouvez contourner ce PrettyPrinter.format surchargeant 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şüğçö}

Vous devriez utiliser des chaînes Unicode au lieu des chaînes 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)

Le module pprint est conçu pour imprimer tout type de structure imbriquée de manière lisible. Pour ce faire, il imprimera la représentation des objets plutôt que de la convertir en une chaîne, de sorte que vous obtiendrez la syntaxe d'échappement si vous utilisez des chaînes Unicode ou non. Mais si vous utilisez unicode dans votre document, alors vous devriez vraiment utiliser des littéraux Unicode!

Quoi qu'il en soit, thg435 vous a donné une solution pour changer ce comportement de pformat.





formatting