我正在搞乱一些原生的Windows控制台功能,如果不是它们的易用性,它们的速度给我留下了深刻的印象。
无论如何,我早就知道下面的代码会产生一些有趣的字符
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 :(得分:1)
尝试使用FillConsoleOutputCharacterA而不是FillConsoleOutputCharacterW,它使用的是unicode字符,可以获取一些知识来正确获取。
编辑我尝试使用FillConsoleOutputCharacterA,它为你的第一个案例提供了相同的输出。
答案 1 :(得分:0)
FillConsoleOutputCharacterA
应该写出与cout函数相同的字符集。这些字符由控制台的当前代码页确定。
使用FillConsoleOutputCharacterW,您仍然可以生成所有相同的字符(以及控制台字体中可能包含的任何其他字符),但您需要对这些字符使用Unicode(16位)代码,而不是与cout一起使用的8位代码。
请注意,Windows内部使用过时的Unicode版本,其字符限制为16位(0-65536),而不是Unicode本身使用0-1,112,063(尽管大多数这些代码仍未分配)。我相信控制台的Unicode字符集对应于Unicode的平面0,即基本的多语言平面。
当您编写控制字符或当前字体中未包含的字符时,会出现问号。