2012-06-04 3 views
15

Этот вопрос базируется на побочном эффекте that one.Невозможно кодировать/декодировать вывод pprint

Мои .py файлы все имеют # -*- coding: utf-8 -*- кодирования Определитель на первой линии, как мой api.py

Как я уже на связанный с этим вопрос, я использую HttpResponse вернуть документацию API. Так как я определил кодировку:

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

Все нормально, и когда я называю службу API, не существуют никаких проблем кодирования, кроме струны, образованная из словаря pprint

Поскольку я использую турецкий символы в некоторых значениях в моем Словаре, pprint преобразует их в unichr эквиваленты, как:

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

И мой обычный выходной текст как:

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

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

Я пытаюсь расшифровать или выход кодирования pprint в различные кодировки, без успеха ... Что является лучшей практикой для преодоления этой проблемы

ответ

35

pprint, как представляется, использовать repr по умолчанию, вы можете обойти это переопределение 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şüğçö} 
+0

Спасибо много, работает как шарм (: – FallenAngel

+2

, если, как и я, вы пытаетесь использовать это с помощью 'pformat' (вместо pprint) и отправляете результирующую строку в механизм шаблонов, такой как' jinja2', это даст вам 'UnicodeDecodeError', который вы можете решить, вызвав (в терминах этого ответа)' unicode (MyPrettyPrinter() .pformat (d), 'utf-8') '. – fiatjaf

+1

Можете ли вы обернуть свой префикс с помощью параметра набора опций PyPI, это будет полезно. –

1

Вы должны использовать юникод строку вместо 8-битных:

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) 

Модуль pprint предназначен для распечатки всего возможного типа вложенной структуры читаемым способом. Для этого он будет печатать представление объектов, а затем преобразовывать его в строку, поэтому вы получите синтаксис escape, потому что вы используете строки Unicode или нет. Но если вы используете юникод в своем документе, вам действительно нужно использовать литералы из Юникода!

В любом случае, thg435 has given you a solution как изменить это поведение pformat.

+0

является нормальным (не Unicode) строка, известная как двоичные строки? Я думал, что они были строками ascii – jdi

+0

Я тоже это пробовал, я также попробовал django 'smart_str',' smart_unicode' и другие методы ... Когда я использую строку unicode, например 'u'müşteri', я получаю' u'm \ xfc \ u015fteri'' – FallenAngel

+0

@FallenAngel - это представление строки unicode, которая генерируется pformat, я вижу, что ваша проблема немного отличается, тогда я подумал ... Я еще раз проверю это ... – mata

Смежные вопросы