devcpp的ascii碼輸出字元時為什麼和ascii碼錶上的字元不同?

比如說 ascii碼為1的應該輸出笑臉 可用devcpp輸出的是方塊 …


首先需要指出的是,Windows的控制台使用的並不是單純的ASCII,而是各種不同(與ASCII相似)的「代碼頁」。在ASCII中,0~31是控制字元,它們本身並不是可以顯示的字元。但 IBM PC 所使用的字符集(代碼頁437)可將這些控制字元顯示為特殊符號,例如 1 對應笑臉(?)等。這個傳統被保留了下來,你可以在 Windows 7 以及之前的系統上(代碼頁936下)通過 putchar(1) 來顯示一個笑臉。Windows 10 (Windows 8?)看起來移除了這個功能,你只能看到一個方塊(無法顯示的字元)。

(來源:Code page 437 - Wikipedia)

如有差錯歡迎指出。


「ascii 碼為 1 的應該輸出笑臉」的碼錶不是 ASCII,是 CP437,這個碼錶最初是直接編在 VGA 顯卡裡面的。

如果想在 CP936 下使用的話似乎是只有點陣字體才支持,其他的都會顯示成方塊。當然你也可以用 WriteConsoleOutputW 輸出 U+263A 得到相同的符號(當然字體要支持)。


你的控制台默認代碼頁設置不是936或者437,估計是15001(UTF-8),輸出按UTF8被解析為01 13 10或者01 00了,自然無法顯示。


推薦閱讀:

在C++11中,如何將一種編碼的string轉換為另一種編碼的string?
如何將一個函數編譯成二進位文件?
微軟對 C++ 的影響力有多大?
為什麼要有堆區和棧區呢?
如何將一個有序的數組隨機排序?

TAG:編程 | C編程語言 | CC |