2012-06-03 43 views
1

我與一些本地Windows控制檯功能搞亂,並感到自己的速度印象深刻,如果不是他們的易用性。FillConsoleOutputCharacter/WriteConsoleOutput和特殊字符

無論如何,我很早就知道,下面的代碼會產生一些有趣的人物

for(int i = 0; i < 256; i++) 
{ 
    cout << char(i) << endl; 
} 

但是,我不能讓FillConsoleOutputCharacter或WriteConsoleOutput生產所有這些字符的(很多人只是顯示爲問號)。

這裏是我使用的代碼示例:

COORD spot = {0,0}; 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
DWORD Written; 

for(int i = 0; i < 256; i++) 
{ 
    FillConsoleOutputAttribute(hOut, 7, 1, spot, &Written); 
    FillConsoleOutputCharacterW(hOut, char(i), 1, spot, &Written); 

    spot.Y++; 
} 

有誰知道寫與本機功能這些字符相對便捷的方式?

順便說一下,我在Windows 7 x64上使用Visual Studio 2010。

回答

0

FillConsoleOutputCharacterA應該寫在同一組的COUT功能確實字符。這些字符由控制檯當前的代碼頁確定。

隨着FillConsoleOutputCharacterW,你仍然可以生成所有相同的字符(以及可能被包含在控制檯字體任何其他字符),但你需要使用Unicode(16位)編碼這些字符,而不是與cout一起使用的8位代碼。

請注意,Windows內部使用Unicode的過時版本,字符限制爲16位(0-65536),而不是使用0-1,112,063的Unicode(儘管其中大部分代碼保持未分配狀態)。我相信控制檯的Unicode字符集對應於Unicode的平面0,即基本的多語言平面。當你寫一個控制字符或不包含在當前的字體字符

問號出現。

+0

非常感謝! FillConsoleOutputCharacterA和WriteConsoleOutputA完美地工作。在Windows控制檯中使用unicode會有什麼好處嗎?我的(理所當然有限的)理解是,控制檯中的輸出限制爲256個字符(由代碼頁定義,我也模糊了)。無論如何,非常感謝這份詳細,及時,有益的答覆! – Kvothe

+0

使用Unicode跳過代碼頁,這意味着您可以使用盡可能多的不同字符(無限制256個字符),儘管您仍然僅限於控制檯字體中包含的字符。如果默認字體不包含您想要的字符,您可以選擇其他字體。 –

1

嘗試使用FillConsoleOutputCharacterA代替FillConsoleOutputCharacterW這是使用可以採取的知識一點點地得到正確的Unicode字符。

編輯我試過使用FillConsoleOutputCharacterA,它給出了等價的輸出到你的第一種情況。