2012-11-19 27 views
11

我在Windows 8中的CMD,我已設置代碼頁65001(chcp 65001)。我正在使用Python 2.7.2(ActivePython 2.7.2.5),並且已將PYTHONSTARTUP環境變量設置爲「bootstrap.py」。爲什麼在將Unicode寫入CMD時會出現IOErrors? (與代碼頁65001)

bootstrap.py:

import codecs 
codecs.register(
    lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None 
) 

這讓我打印的ASCII:

>>> print 'hello' 
hello 
>>> print u'hello' 
hello 

但我得到的,當我嘗試打印Unicode字符串與非ASCII字符的錯誤是沒有感覺到我。在這裏,我嘗試打印包含北歐符號弦數(我加入了版畫的可讀性之間的額外換行符):

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

正如你看到它並不總是產生錯誤(甚至不提高每次都會出現同樣的錯誤),而北歐符號只能偶爾顯示。

有人可以解釋這種行爲,或者至少幫我弄清楚如何正確地打印Unicode到CMD?

+2

這是一個惡夢的情況。在SO和其他地方已經討論了這麼多次。例如:http://www.google.com/search?q=print+unicode+windows+console+python –

+0

最簡單的解決方案是使用Python 3.3,如果可以的話。它有一個[cp65001編解碼器](http://docs.python.org/3/whatsnew/3.3.html#codecs)。 – eryksun

+0

@PiotrDobrogost:如果你能找到它,請參考另一個案例(而且我不**意味着Unicode解碼錯誤!) – Hubro

回答

1

嘗試這個辦法:從__future__進口unicode_literals

# -*- coding: utf-8 -*- 
    from __future__ import unicode_literals 
    print u'æøå' 

利用的將在一個交互式的Python會話是有用的。

這當然是可以寫的Unicode成功使用WriteConsoleW控制檯。無論控制檯代碼頁(包括65001)如何,這都可以工作。代碼here這樣做(它適用於Python 2.x,但是您可以從C中調用WriteConsoleW)。

WriteConsoleW有一個我知道的bug,就是它fails when writing more than 26608 characters at once。通過限制單次調用中傳遞的數據量,這很容易解決。

字體不是Python的問題,但編碼是。僅僅因爲某些用戶可能沒有選擇可以顯示這些字符的字體而無法輸出正確的字符是沒有意義的。這個錯誤應該重新打開。 (爲了完整,可以在控制檯上使用除Lucida控制檯和Consolas以外的字體顯示Unicode,但它是requires a registry hack。) 我希望它有幫助。

+0

我相信WriteConsoleW僅限於UCS-2,即不能使用輔助平面中的字符。但在大多數情況下,這應該不成問題。 –

相關問題