2012-06-04 43 views
15

Câu hỏi này dựa trên tác dụng phụ của that one.Không thể mã hóa/giải mã đầu ra pprint

.py file của tôi là tất cả đều có # -*- coding: utf-8 -*- mã hóa DEFINER trên dòng đầu tiên, giống như tôi api.py

Như tôi đã đề cập về vấn đề có liên quan, tôi sử dụng HttpResponse để trả lại tài liệu api. Kể từ khi tôi định nghĩa mã hóa bởi:

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

Mọi thứ đều ok, và khi tôi gọi dịch vụ API của tôi, không có vấn đề mã hóa trừ chuỗi hình thành từ một cuốn từ điển bằng cách pprint

Kể từ khi tôi đang sử dụng Thổ Nhĩ Kỳ nhân vật trong một số giá trị trong dict của tôi, pprint chuyển đổi chúng sang unichr tương đương, như:

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

Và đầu ra văn bản đơn giản của tôi là như sau:

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

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

tôi cố gắng để giải mã hoặc mã hóa đầu ra pprint để mã hóa khác nhau, không có sự thành công ... thực hành tốt nhất để khắc phục vấn đề này

Trả lời

35

pprint dường như sử dụng repr theo mặc định, bạn có thể làm việc xung quanh này bằng cách ghi đè 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

Cảm ơn rất nhiều, hoạt động như một sự quyến rũ (: – FallenAngel

+2

nếu, như tôi, bạn đang cố gắng sử dụng điều này với 'pformat' (thay vì pprint) và gửi chuỗi kết quả đến một công cụ tạo khuôn mẫu như' jinja2', nó sẽ cung cấp cho bạn một 'UnicodeDecodeError', mà bạn có thể giải quyết bằng cách gọi (trong các điều khoản của câu trả lời này)' unicode (MyPrettyPrinter(). pformat (d), 'utf-8') '. – fiatjaf

+1

Bạn có thể bọc pprint của bạn với tùy chọn thiết lập định dạng để PyPI, nó sẽ rất hữu ích. –

1

Bạn nên sử dụng các chuỗi unicode thay vì những 8-bit là gì:

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) 

Mô-đun pprint được thiết kế để in ra tất cả các loại cấu trúc lồng nhau có thể đọc được theo cách dễ đọc. Để làm điều đó nó sẽ in các đại diện đối tượng thay vì sau đó chuyển đổi nó thành một chuỗi, vì vậy bạn sẽ kết thúc với cú pháp thoát wheather bạn sử dụng các chuỗi unicode hay không. Nhưng nếu bạn đang sử dụng unicode trong tài liệu của bạn, thì bạn thực sự nên sử dụng các chữ cái unicode!

Dù sao, thg435 has given you a solution cách thay đổi hành vi này của pformat.

+0

Are bình thường (không unicode) chuỗi được gọi là chuỗi nhị phân? Tôi nghĩ rằng họ đã ascii dây – jdi

+0

tôi đã cố gắng mà quá, tôi cũng đã cố gắng django 'smart_str',' smart_unicode' và soe các phương pháp khác ... Khi tôi sử dụng chuỗi unicode như 'u'müşteri', những gì tôi nhận được là' u'm \ xfc \ u015fteri'' – FallenAngel

+0

@ FallenAngel - đó là biểu diễn cho chuỗi unicode được tạo bởi pformat, tôi thấy rằng vấn đề của bạn hơi khác một chút thì tôi nghĩ ... Tôi sẽ kiểm tra lại ... – mata

Các vấn đề liên quan