此问题基于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输出解码或编码为不同的编码,但没有成功......解决此问题的最佳做法是什么
答案 0 :(得分: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şüğçö}
答案 1 :(得分: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
模块旨在以可读的方式打印出所有可能的嵌套结构。要做到这一点,它将打印对象表示,而不是将其转换为字符串,所以你最终将使用转义语法,你或不使用unicode字符串。但是如果你在文档中使用unicode,那么你真的应该使用unicode文字!
无论如何,thg435 has given you a solution如何改变pformat的这种行为。