直接从源代码编写unicode(?)字符到WriteConsoleOutput

时间:2016-10-06 15:40:13

标签: c++ c arrays string windows

我正在尝试使用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.AsciiCharSetConsoleCP函数,但我不知道如何利用它们来帮助我解决这个问题。
•更改 Visual Studio - &gt;项目 - &gt;项目属性.. - &gt;字符集设置为每个可能的值 •除上述设置外,还特别使用SetConsoleOutputCPWriteConsoleOutputA •使用(/ out)签名将源代码文件编码更改为UTF-8。

在我的项目中,我以编程方式将命令提示字体设置为8x8终端,据我所知,这不支持实际的unicode字符。显示可用字符here。这些字符确实包含'☺',所以我不完全确定我的问题是关于unicode。我不知道了。请帮忙。

1 个答案:

答案 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中查询标识符(转到定义等),您应该看到您拥有的版本。