2012-09-08 109 views
0

我想打印一組Unicode字符到我的命令提示符終端。即使我強制編碼爲「UTF-8」,終端也會打印一些垃圾。打印unicode字符到標準輸出python打印錯誤的字形

$python -c "import sys; print sys.stdout.write(u'\u2044'.encode('UTF-8'))" 
ΓüäNone 

$python -c "import sys; print sys.stdout.encoding" 
cp437 

我的默認終端編碼是cp437,我試圖重寫。這裏預期的輸出是級分斜槓(/)

http://www.fileformat.info/info/unicode/char/2044/index.htm

的同一段代碼完美的作品在我的Mac終端,它使用UTF-8作爲默認編碼。有沒有辦法在Windows上顯示它?我在Windows命令提示符下使用的字體是consolas。

我希望我的代碼能夠處理任何Unicode字符,而不僅僅是這個特殊的例子,因爲輸入是一個Web查詢結果,我無法控制它。

+0

有東西在我的後腦勺告訴我,UTF-8和Windows終端將無法輕鬆地工作 –

+0

我已經接近後放棄通過這個bug http://bugs.python.org/issue1602 – Benny

+0

你可以找到另一個終端程序來工作,而不是Windows的cmd或其他。我聽說可以安裝mingw並在那裏有一個半工作終端。 Otherwiser,只需安裝一個虛擬machinne併爲我們的開發工具建立一個合適的Linux環境。 – jsbueno

回答

2

您必須使用UTF-8代碼頁(cp65001)才能顯示UTF-8編碼文本。

Python 3.3聲稱在Windows上支持代碼頁65001(UTF-8)。

C:\>chcp 65001 
Active code page: 65001 

C:\>python 
Python 3.3.0rc1 (v3.3.0rc1:8bb5c7bc46ba, Aug 25 2012, 13:50:30) [MSC v.1600 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print('\u2044') 
⁄ 

雖然它是越野車:

>>> print('\u2044') 
⁄ 

>>> print('\u2044'*8) 
⁄⁄⁄⁄⁄⁄⁄⁄ 
��⁄⁄⁄⁄ 
⁄⁄ 
�� 

>>> print('1\u20442 2\u20443 4\u20445') 
1⁄2 2⁄3 4⁄5 
⁄5 
+0

爲我工作!非常感謝! – Benny

5

Python無法控制您的終端使用的編碼;你必須在別的地方改變它。

換句話說,僅僅因爲你強制python輸出UTF-8編碼的文本到終端,並不意味着你的終端會奇蹟般地開始輸出爲,接受也輸出爲UTF-8。

Mac OS X終端已被配置爲使用UTF-8。

在Windows上,你可以用chcp命令切換控制檯代碼頁:

chcp 65001 

,其中65001是Windows代碼頁爲UTF-8。請參見Unicode characters in Windows command line - how?

+0

我剛剛試過這個:'$ chcp 65001 活動代碼頁:65001 $ python -c「import sys; print sys.stdout.write(u'\ u2044'.encode('UTF-8')) 「 無' – Benny

+0

@Benny:爲什麼不簡單地調用'print(u'\ u2044')'? 「sys.stdout.encoding」給你什麼? 'print'會自動編碼爲您的後一種編碼。鏈接的堆棧溢出問題還會告訴您切換控制檯的字體。 –

+0

哦,這是我真正開始的地方,這次python本身無法打印,因爲它試圖使用cp437編碼打印Unicode字符,這是一個8位代碼點>>> print(u'\ u2044') 回溯(最近呼叫最後一個): 文件「」,第1行,在 文件「C:\ Python27 \ lib \ encodings \ cp437.py」,第12行,編碼爲 return codecs.charmap_encode(input,errors ,encoding_map) UnicodeEncodeError:'charmap'編解碼器無法編碼字符u'\ u2044'在位置 0:字符映射到' – Benny