2013-07-27 61 views
0

我正在運行Windows 7,並且它的控制檯已配置爲使用Consolas字體,這使我可以輸出Unicode。在控制檯中讀取Unicode的能力已經多次證明,例如Far Manager的程序:西里爾文和德文äö字母可以在同一個控制檯上在同一個字符串中讀取,而無需編碼切換。從cmd.exe運行時在Python stdout中的Unicode輸出

現在關於Python。

我很努力,但在輸出中看不到Unicode。 默認情況下,print(sys.stdout.encoding)打印cp866,標準輸出無法輸出除ASCII和西裏爾字母之外的任何字符。

它給了我下面的結果:

print("Ля-ля äöüÄÖÜß")

UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-12: character maps to <undefined>

print("Ля-ля äöüÄÖÜß".encode("utf-8"))

b'\xd0\x9b\xd1\x8f-\xd0\xbb\xd1\x8f \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x84\xc3\x96\xc3\x9c\xc3\x9f'

好吧,我給自己定的批處理文件的PYTHONIOENCODING環境變量:

SET PYTHONIOENCODING=UTF-8

,並得到:

print(sys.stdout.encoding) 
UTF-8 

print("Ля-ля äöüÄÖÜß") 
╨Ы╤П-╨╗╤П ├д├╢├╝├Д├Ц├Ь├Я 

print("Ля-ля äöüÄÖÜß".encode("utf-8"))` 
b'\xd0\x9b\xd1\x8f-\xd0\xbb\xd1\x8f \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x84\xc3\x96\xc3\x9c\xc3\x9f' 

怎麼辦?

+0

Windows控制檯非常難以打印更高代碼點的unicode值。 –

+0

@Martijn Pieters:我不確定你稱之爲「更高的代碼點」值。我至少需要俄語和德語,並且Windows控制檯證明它可以做到這一點。 – Paul

+0

問題是您的控制檯代碼頁需要切換,但Microsoft提供的唯一代碼頁是cp65001;他們的UTF-8這個充滿bug的想法。例如,請參閱http://alfps.wordpress.com/2011/11/22/unicode-part-1-windows-console-io-approaches/。 –

回答

4

實際上,Python和Windows控制檯之間的交互中存在一個有點bug(請參閱http://bugs.python.org/issue1602)。可以使用C函數ReadConsoleW,WriteConsoleW而不是ReadConsole和WriteConsole在Windows控制檯中讀取和寫入Unicode。所以一個看起來可行的解決方案是編寫自己的stdout和stdin對象,通過ctypes調用ReadConsoleW,WriteConsoleW。對於輸出這個工作,但對於輸入有一個問題,即Python交互式解釋器實際上不使用sys.stdin來獲取輸入(但調用input()函數) - 請參見http://bugs.python.org/issue17620

很多人都說Windows控制檯存在問題。但是你實際上可以輸入Unicode字符(如果你有正確的鍵盤佈局),沒有問題。這些顯示沒有問題。你甚至可以使用一些Unicode參數運行名爲「∫.py」的文件,它可以正確運行並且參數在sys.argv字符串中等待。

更新:我已經構建了一個Python包來處理這些問題。請參閱https://github.com/Drekin/win-unicode-consolehttps://pypi.python.org/pypi/win_unicode_console。由pip install win_unicode_console安裝。它至少適用於Python 3.4,Python 3.5和Python 2.7。

+0

該錯誤已在2007-12-12提交,仍然沒有解決方案! – Paul

相關問題