2010-06-24 54 views

Trả lời

4

Chỉ cần sử dụng một chuỗi định dạng unicode, hơn là có một chuỗi byte trong vai trò đó:

>>> class X(object): 
... def __str__(self): return 'str' 
... def __unicode__(self): return u'unicode' 
... 
>>> x = X() 
>>> print u'%s' % x 
unicode 
+0

Có '__unicode__' trả về một bytestring và in một đối tượng unicode làm ví dụ khủng khiếp. –

+0

@Mike, đã đồng ý về vấn đề 'return' - đã khắc phục lỗi đánh máy đó. Sự bất đồng mạnh mẽ trên 'print': trên một nền tảng khá,' sys.stdout.encoding' được thiết lập và bản in sẽ hoạt động hoàn hảo - trong khi bạn đang đoán một cách mù quáng vào 'some_encoding' để sử dụng (nếu nó không phải trên sys. stdout như thế nào bạn sẽ đoán nó, cầu nguyện?). –

+1

về những gì "nền tảng phong nha" hiện 'python -c 'in u" \ xff "'> some_file' không nâng cao UnicodeEncodeError? – habnabit

1

số Nó sẽ không có ý nghĩa cho điều này là trường hợp.

print (u"%s" % obj).encode(some_encoding) sẽ sử dụng obj.__unicode__.

+1

Ghét ý tưởng của một cách mù quáng đoán tại 'some_encoding' vì câu trả lời này sẽ buộc một người phải làm - một nền tảng phong nha sẽ thiết lập' sys.stdout.encoding' để một 'print' đơn giản sẽ hoạt động hoàn hảo, nếu bạn không phải bọc sys.stdout vào một trình bao bọc để đặt mã hóa, trong ** một ** địa điểm (sau đó bạn có thể sử dụng 'print' như là chỉ thích hợp và phong nha!), chứ không phải là đánh vần như vậy trên tất cả đồ nội thất (cái gì a * * cách khủng khiếp ** để chương trình). –

0

Thứ nhất, có cái nào không?

Chắc chắn (sắp xếp). Chuỗi định dạng unicode sẽ chuyển đổi các giá trị định dạng thành unicode, ngụ ý rằng obj.__unicode__ sẽ được gọi (reference).

u'this is a %s' % ('unicode string') 

Ngoài việc trên, không có lý do cụ thể tại sao bạn không thể rõ ràng:

print '%s' % (unicode(obj)) 
+0

'print '% s'% unicode (obj)' không thực sự rõ ràng. Nó ngầm ẩn lên một đường vào một unicode khi% được áp dụng, đó là một trong những điều xấu xí mà Python làm. –

+0

Tình cờ gặp vấn đề này sau vài giây. Tôi đoán điều này làm việc cho tôi! – mpen

+1

... và nó dựa vào 'in'ing chuỗi unicode chính xác như câu trả lời của tôi đã bị rút ngắn, nhiều lần bị bỏ qua và nhiều câu trả lời trước đó - có thể xác nhận sự nghi ngờ rằng downvoters thực sự có ý định cá nhân thù hận, không phải là một phản đối kỹ thuật, bất cứ điều gì mealy-mouthed từ họ có thể cố gắng ăn mặc nó trong ;-). –

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