Tôi đang trên CMD trong Windows 8 và tôi đã đặt mã hóa thành 65001 (chcp 65001
). Tôi đang sử dụng Python 2.7.2 (ActivePython 2.7.2.5) và tôi đã đặt biến môi trường PYTHONSTARTUP thành "bootstrap.py".Tại sao tôi nhận được IOErrors khi viết Unicode vào CMD? (Với codepage 65001)
bootstrap.py:
import codecs
codecs.register(
lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None
)
này cho phép tôi in ASCII:
>>> print 'hello'
hello
>>> print u'hello'
hello
Nhưng các lỗi tôi nhận được khi tôi cố gắng in một chuỗi Unicode với các ký tự ASCII làm cho không có cảm giác với tôi. Ở đây tôi cố gắng in một vài chuỗi có chứa các ký hiệu Bắc Âu (tôi đã thêm ngắt dòng phụ giữa các bản in để dễ đọc):
>>> print u'æøå'
��øåTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory
>>> print u'åndalsnes'
��ndalsnes
>>> print u'åndalsnesæ'
��ndalsnesæTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
>>> print u'Øst'
��st
>>> print u'uØst'
uØstTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
>>> print u'ØstÆØÅæøå'
��stÆØÅæøåTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
>>> print u'_ØstÆØÅæøå'
_ØstÆØÅæøåTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
Như bạn thấy nó không phải lúc nào cũng gây ra lỗi (và thậm chí không tăng cùng một lỗi mỗi lần) và các ký hiệu Bắc Âu chỉ được hiển thị chính xác thỉnh thoảng.
Ai đó có thể giải thích hành vi này, hoặc ít nhất giúp tôi tìm hiểu cách in Unicode sang CMD chính xác?
Đây là một tình huống ác mộng. Và nó đã được thảo luận một lần gazillion ở đây trên SO và ở nơi khác. Ví dụ: http://www.google.com/search?q=print+unicode+windows+console+python –
Giải pháp đơn giản nhất là sử dụng Python 3.3, nếu bạn có thể. Nó có một [cp65001 codec] (http://docs.python.org/3/whatsnew/3.3.html#codecs). – eryksun
@PiotrDobrogost: Hãy giới thiệu cho tôi một trường hợp khác như thế này nếu bạn có thể tìm thấy nó (và tôi ** không ** có nghĩa là lỗi giải mã Unicode!) – Hubro