我正在尝试使用WinApi中的WriteConsoleOutput
将字符写入命令提示符窗口缓冲区。问题是,我真的希望能够将☺
等字符直接写入源代码中,而不是使用某种编码/符号,如'\uFFFF'
或{{ 1}},因为我不太了解它们(代码页/字符集/等之间的差异)
下面的代码展示了我最简单的问题形式。运行此代码不会在命令提示符窗口中打印'0xFF'
,而是在问号(☺
)中打印。
?
我的代码在所有Windows版本之间显示相同的输出是至关重要的,无论安装/使用的是哪种语言。 所以据我所知(这无疑是最小的),我需要设置一个特定的代码页(希望在任何语言的Windows中都能被命令提示符支持)。
我试过了:
•从使用#include <Windows.h>
int main()
{
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CHAR_INFO c[1] = {0};
COORD cS = {1, 1};
COORD cH = {0, 0};
SMALL_RECT sr = {0, 0, 0, 0};
c[0].Attributes = FOREGROUND_INTENSITY;
c[0].Char.UnicodeChar = '☺';
WriteConsoleOutput(h, c, cS, cH, &sr);
Sleep(5000);
return 0;
}
更改为CHAR_INFO.UnicodeChar
•摆弄CHAR_INFO.AsciiChar
和SetConsoleCP
函数,但我不知道如何利用它们来帮助我解决这个问题。
•更改 Visual Studio - &gt;项目 - &gt;项目属性.. - &gt;字符集设置为每个可能的值
•除上述设置外,还特别使用SetConsoleOutputCP
或WriteConsoleOutputA
•使用(/ out)签名将源代码文件编码更改为UTF-8。
在我的项目中,我以编程方式将命令提示字体设置为8x8终端,据我所知,这不支持实际的unicode字符。显示可用字符here。这些字符确实包含'☺',所以我不完全确定我的问题是关于unicode。我不知道了。请帮忙。
答案 0 :(得分:1)
C源必须仅为ascii。如果您在C源文件中嵌入非ascii字符,并且IDE可能会以正确的格式显示它们,但编译器很可能以不同的方式对它们进行处理,并且您传递它们的可执行函数仍然可以区别对待它们。它不便携或不可靠。但是您可以使用转义序列\ x在C字符串中嵌入任意字节。
UTF-8适合内部使用,但Windows API尚不支持它,因此您需要转换为Windows 16位字符(几乎但不完全是UTF-16)才能显示扩展字符。但是,您必须确保调用Windows API的宽字符版本。大多数采用字符串的Windows API函数都有A和W版本(ascii和wide),以实现二进制向后兼容性。如果您在IDE中查询标识符(转到定义等),您应该看到您拥有的版本。