Вопрос по unicode, python – Невозможно кодировать / декодировать вывод pprint

16

Этот вопрос основан на побочном эффектевон тот.

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

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

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

Все в порядке, и когда я вызываю свой API-сервис, проблем с кодированием не возникает, кромеthe string formed from a dictionary by pprint

Поскольку я использую турецкие символы в некоторых значениях в моем dict, 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 в разные кодировки, но безуспешно ... Как лучше всего решить эту проблему?

Ваш Ответ

2   ответа
38

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şüğçö}
Error: User Rate Limit Exceeded FallenAngel
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededpformatError: User Rate Limit Exceededjinja2Error: User Rate Limit ExceededUnicodeDecodeErrorError: User Rate Limit Exceededunicode(MyPrettyPrinter().pformat(d), 'utf-8').
1

Вы должны использовать строки Unicode вместо 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-синтаксис, независимо от того, используете ли вы строки юникода или нет. Но если вы используете в своем документе юникод, то вам действительно следует использовать литералы юникода!

Тем не мение,thg435 дал вам решение как изменить это поведение pformat.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsmart_str, smart_unicodeError: User Rate Limit Exceededu'müşteriError: User Rate Limit Exceededu'm\xfc\u015fteri' FallenAngel
Error: User Rate Limit ExceededstrError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы