1

我正在搞乱一些本机 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。

4

2 回答 2

1

尝试使用 FillConsoleOutputCharacterA 而不是使用 unicode 字符的 FillConsoleOutputCharacterW,这可能需要一些知识才能正确获取。

编辑我尝试使用 FillConsoleOutputCharacterA,它为您的第一个案例提供了等效的输出。

于 2012-06-04T00:13:10.693 回答
0

FillConsoleOutputCharacterA应该写入与 cout 函数相同的字符集。这些字符由控制台的当前代码页确定。

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

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

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

于 2012-06-04T00:19:13.393 回答