2014-05-18 77 views
1

我將Unicode字符輸出到Windows上的控制檯,並且當我手動將字體更改爲Lucidia Grande時,輸出如預期的那樣。但我的問題是,Python,Ruby等如何使用默認字體將unicode字符輸出到Windows控制檯?我以爲默認的字體不支持所有的Unicode字符?Windows上的Unicode更改控制檯字體

回答

1

Python,Ruby等如何使用默認字體將unicode字符輸出到Windows控制檯?

他們不能也不顯示所有的Unicode字符。默認的控制檯字體aka「Raster Fonts」映射到.fon文件,該文件的字形在您的語言環境的DOS代碼頁中帶有字形。西歐安裝即code page 850。在此代碼頁中,您確實會看到一些重音字母和其他非ASCII字符,但其他任何來自較寬Unicode的字符都將顯示爲?

實際上,即使您更改爲矢量字體,當您運行使用標準庫I/O函數(Python和Ruby)的MS C運行時實現的程序時,仍然僅限於單個代碼頁。您可以選擇更多的選擇,因爲您可以使用chcp更改爲更多範圍的代碼頁,而不是「光柵字體」支持的代碼頁,但仍然無法以這種方式獲得全部Unicode。

(原則上,你應該能夠chcp 65001得到UTF-8,但也有在Windows落實這一點,通常使其無法使用嚴重的bug,或者chcp 65000爲UTF-16,但由於這不是一個ASCII超它傾向於打破stdio應用程序,包括Python/Java等)

+0

嗨,我使用GetConsoleCp()函數,並發現代碼頁爲850,正如你前面說過的有一些口音。那麼爲什麼當我試圖說出「á」這個字母時,我會得到這個奇怪的字母嗎?這是一個截圖的鏈接,所以你可以看到。 [鏈接](https://dl-web.dropbox.com/get/screenshot.png?_subject_uid=295255838&w=AAB7mNwAHgEPW5RU8TB4yF4M8dfc1-p0eQBq1UU9AjEpug)在它們之間隔兩個850的應該是字母「A」,而是你會看到它的不。有沒有辦法解決?謝謝! – Francis

+1

截圖鏈接已損壞,但我的猜測是您的源代碼可能是使用錯誤編碼編譯的。爲了避免源代碼編碼問題,你可以把它寫成如'std :: cout <<'\ xA0'(因爲''是cp850中的字節160')。 – bobince

+0

感謝您的回答。它現在輸出正確。只是一個問題。我如何使用SetConsoleOutputCP()函數?因爲每次使用它時,代碼頁實際上都不會更改爲我設置的代碼頁。謝謝! – Francis