2016-11-05 40 views
0

一旦我編寫了一個ac程序並嘗試在windows 10的cmd窗口上用printf()輸出特殊字符(如äöüß),它只會顯示出像▒▒▒▒▒▒▒▒▒▒▒▒▒如何在cmd窗口中輸出特殊字符?

但是,如果我只是在沒有執行ac程序的情況下在cmd窗口中鍵入它們,它會正確顯示這些字符。 當我在NetBeans中將控制檯類型更改爲標準輸出時,輸出也是正確的。 我試圖改變cmd的代碼頁,但它沒有解決問題。 我使用gcc c編譯器。

回答

2

它的printf的處理,在默認情況下的printf 只有打印的ASCII字符作中,一個的到z的,這裏是維基百科的文章https://en.wikipedia.org/wiki/ASCII,打印特殊字符/其他語言的字符,請使用鏈接的方式這一點,你要打印

printf(L"your string"); 
總之

,您的字符串前加前綴L,大寫L打印特殊字符的文本替換您的字符串。

希望它幫助mukund2003

+0

這會導致編譯器警告,它只會打印'「y」'。在UTF16小尾數字符串中,第二個字節是零。你不能像這樣混合使用ANSI和Unicode。 –

2

的原因是不同的代碼頁的字符編碼的使用。

在GUI文本編輯器中編寫存儲在每個字符只用一個字節編碼的文件中的程序代碼時,代碼頁Windows-1252用於西歐和北美國家。

在運行控制檯應用程序時打開的控制檯窗口中,使用了OEM代碼頁,這是在西歐國家OEM 850和北美國家OEM 437

因此,您需要用ÄÖÜäöüß代碼編寫不同的字節值,以便在控制檯窗口中按預期方式顯示這些字符,至少在西歐和北美國家執行。

Character Windows-1252 OEM 850 
    Ä    \xC4   \x8E 
    Ö    \xD6   \x99 
    Ü    \xDC   \x9A 
    ä    \xE4   \x84 
    ö    \xF6   \x94 
    ü    \xF1   \x8C 
    ß    \xDF   \xE1 

在控制檯窗口默認使用的代碼頁可以通過打開命令提示窗口中可以看出,並運行任一chcp(變化碼頁)或mode其中兩個顯示活動代碼頁。

計算機上用戶帳戶的GUI應用程序和控制檯應用程序的默認代碼頁取決於此用戶帳戶的Windows區域和語言設置。

某些網頁,你應該閱讀,以便更好地理解字符編碼:

編程人員不應將非ASCII字符寫入由編譯的可執行文件輸出的字符串中,因爲它取決於編譯器在創建可執行文件中字符的二進制表示(字節)時使用哪個代碼頁。在輸出字符串之前,應用程序執行的活動代碼頁已知或應用程序定義時,最好使用十六進制符號。

也可以將Unicode字符串存儲在可執行文件中,在輸出任何字符串之前確定輸出句柄的編碼,並在將字符串寫入輸出句柄之前將每個Unicode字符串轉換爲輸出句柄的編碼。

當然,它取決於使用的輸出字體,如何在可執行文件中的字符串中的字節最終真正顯示在屏幕上。

+0

我嘗試在printf()中使用cmd代碼頁850 rsp中的轉義序列。 1252但他們都沒有工作。輸出仍然是一樣的。但是,如果我使用cygwin終端執行c程序,並將終端的選項菜單中的字符集從默認(UTF-8)更改爲像CP1252那樣,那麼輸出是否正確? –

+0

只需100%清楚。您在Stra \ xE1burg gef \ x84llt。('OEM的字節值)中編譯了您的應用程序,並且您仍然無法在Windows控制檯窗口中輸出Straßburggefällt.'輸出中的Bäume? Cygwin是與Windows命令解釋程序不同的腳本解釋程序。 Cygwin默認使用UTF-8編碼。用UTF-8編碼的同一個字符串將會是「\ xC3 \ xA4umeWordden in Stra \ xC3 \ x9Fburg gef \ xC3 \ xA4llt」。 [UTF-8](https://en.wikipedia.org/wiki/UTF-8)每個字符使用1到4(甚至6個)字節。 – Mofi