FillConsoleOutputCharacter / WriteConsoleOutput和特殊字符

我搞乱了一些原生的Windows控制台function,并且他们的速度给我留下了深刻的印象,即使不是他们的易用性。

无论如何,我早就知道下面的代码会产生一些有趣的字符

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++; } 

有谁知道一个比较方便的方式来写这些字符与本机function?

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

FillConsoleOutputCharacterA应该写出与cout函数相同的一组字符。 这些字符由控制台当前的代码页决定。

使用FillConsoleOutputCharacterW,您仍然可以生成所有相同的字符(以及可能包含在控制台字体中的任何其他字符),但是需要对这些字符使用Unicode (16位)代码,而不是8位与cout一起使用的代码。

请注意,Windows内部使用Unicode的过时版本,字符限制为16位(0-65536),而不是使用0-1,112,063的Unicode(尽管这些代码大部分保持未分配状态)。 我相信控制台的Unicode字符集对应于Unicode的平面0,基本的多语言平面。

当您编写控制字符或当前字体中未包含的字符时,将出现问号。

尝试使用FillConsoleOutputCharacterA而不是FillConsoleOutputCharacterW,它使用的unicode字符,可以采取一点点的知识才能正确获取。

编辑我尝试使用FillConsoleOutputCharacterA,它给你的第一种情况等效的输出。