2011-11-04 35 views
9

Tôi sẽ bắt đầu bằng cách nói rằng tôi đã xem bài đăng này: Strange python print behavior with unicode, nhưng giải pháp được cung cấp ở đó (sử dụng PYTHONIOENCODING) không hoạt động đối với tôi.python unicode xử lý sự khác biệt giữa in và sys.stdout.write

Dưới đây là vấn đề của tôi:

Python 2.6.5 (r265:79063, Apr 9 2010, 11:16:46) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2 
>>> a = u'\xa6' 
>>> print a 
¦ 

chỉ hoạt động tốt, tuy nhiên:

>>> sys.stdout.write(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa6' in position 0: ordinal not in range(128) 

ném một lỗi. Bài đăng tôi liên kết ở trên cùng cho thấy rằng điều này là do mã hóa bảng điều khiển mặc định là 'ascii'. Tuy nhiên, trong trường hợp của tôi, không phải là:

>>> sys.stdout.encoding 
'UTF-8' 

Vì vậy, mọi suy nghĩ về những gì đang hoạt động ở đây và cách khắc phục sự cố này?

Cảm ơn D.

+1

On python 2.7 với mã hóa thiết bị đầu cuối utf-8, mọi thứ dường như đang hoạt động. Bạn có thể thử sys.stdout.write (a.encode ("UTF-8")) và thử xem điều gì sẽ xảy ra? – yasar

+0

Yep, đã hoạt động ... Rất tiếc, tôi vừa nhận ra rằng tôi đã sử dụng phiên bản Python sai để tạo mẫu. Tôi nên sử dụng 2.6.5. Vậy tại sao điều này xảy ra? Một lỗi trong 2,7 Python trước? –

+0

Thận trọng, khi cố gắng viết để stdout, yout Python cố gắng mã hóa đối tượng unicode của bạn với ascii, nhưng thất bại thảm hại. Tôi không chắc chắn tại sao, nhưng tôi không làm điều đó :) – yasar

Trả lời

12

Điều này là do một lỗi tồn tại từ lâu đó là fixed trong python-2.7, nhưng quá muộn để trở lại-được chuyển đến python-2,6.

Tài liệu nêu rõ rằng khi chuỗi unicode được ghi vào một tệp, chúng phải được chuyển đổi thành chuỗi byte bằng cách sử dụng file.encoding. Nhưng điều này đã không được vinh danh bởi sys.stdout, mà thay vào đó là sử dụng mã hóa unicode mặc định. Điều này thường được thiết lập để "ascii" bởi module site, nhưng nó có thể được thay đổi với sys.setdefaultencoding:

Python 2.6.7 (r267:88850, Aug 14 2011, 12:32:40) [GCC 4.6.2] on linux3 
>>> a = u'\xa6\n' 
>>> sys.stdout.write(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec cant encode character u'\xa6' ... 
>>> reload(sys).setdefaultencoding('utf8') 
>>> sys.stdout.write(a) 
¦ 

Tuy nhiên, một giải pháp tốt hơn có thể là để thay thế sys.stdout với một wrapper:

class StdOut(object): 
    def write(self, string): 
     if isinstance(string, unicode): 
      string = string.encode(sys.__stdout__.encoding) 
     sys.__stdout__.write(string) 

>>> sys.stdout = StdOut() 
>>> sys.stdout.write(a) 
¦ 
+0

stdout có nhiều chức năng khác nhau (gần, tuôn ra, ...). Sẽ tốt hơn nếu chỉ thay thế chức năng ghi – halflings

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