django 无法编码/解码pprint输出

ldioqlga  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(154)

这个问题基于that one的副作用。
我的.py文件都在第一行有# -*- coding: utf-8 -*-编码定义器,就像我的api.py一样。
正如我在相关问题中提到的,我使用HttpResponse返回API文档。因为我定义了编码方式:

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

一切正常,当我调用我的API服务时,除了 * 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输出解码或编码为不同的编码,但没有成功...克服这个问题的最佳实践是什么

2guxujil

2guxujil1#

默认情况下,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şüğçö}
hiz5n14c

hiz5n14c2#

你应该使用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模块被设计为以可读的方式打印出所有可能的嵌套结构。要做到这一点,它将打印对象表示,而不是将其转换为字符串,所以无论您是否使用unicode字符串,最终都会使用escape语法。但是如果你在你的文档中使用unicode,那么你真的应该使用unicode文字!
无论如何,thg435 has given you a solution如何改变pformat的这种行为。

相关问题