使用 printf 在控制台中使用 C++ unicode 字符?

Nat*_*Fox 2 c++ windows unicode windows-console

我的代码:

\n\n
#include <iostream>\n#include <windows.h>\n\nusing namespace std;\n\nint pos[9];\n\nint main() {\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c ", pos[0], pos[1], pos[2]);\n    printf("\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90");\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c "), pos[3], pos[4], pos[5];\n    printf("\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90");\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c "), pos[6], pos[7], pos[8];\n    system("pause");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的控制台输出:

\n\n

安慰

\n\n

我知道还有其他方法可以做到这一点,但重点是使用 printf 来实现这一点:| 有任何想法吗?

\n

Mar*_*nen 5

要使用printf,并假设您使用的是美国本地化的 Windows,控制台代码页为 437(运行chcp以检查),那么如果您将源文件保存在代码页 437 中,则以下更正后的代码将起作用。一种方法是执行此操作使用Notepad++并Encoding->Character sets->Western European->OEM-US在菜单上设置。这样做的缺点是你的源代码在大多数编辑器中都无法很好地显示,除非它们特别支持 cp437,甚至 Notepad++ 在重新打开文件时如果不再次设置编码也无法正确显示它。

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <io.h>\n#include <fcntl.h>\n\nint main()\n{\n    char pos[9] = {\'X\',\'O\',\'X\',\'O\',\'X\',\'O\',\'X\',\'O\',\'X\'};\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c \\n", pos[0], pos[1], pos[2]);\n    printf("\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\\n");\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c \\n", pos[3], pos[4], pos[5]);\n    printf("\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\\n");\n    printf(" %c \xe2\x95\x91 %c \xe2\x95\x91 %c \\n", pos[6], pos[7], pos[8]);\n    system("pause");    system("pause");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Windows 上,由于 API 本身是 UTF-16,因此更好的方法是使用以下代码并将文件保存为带 BOM 的 UTF-8:

\n\n
#include <stdio.h>\n#include <stdlib.h>\n#include <io.h>\n#include <fcntl.h>\n\nint main()\n{\n    char pos[9] = {\'X\',\'O\',\'X\',\'O\',\'X\',\'O\',\'X\',\'O\',\'X\'};\n    _setmode(_fileno(stdout), _O_U16TEXT);\n    wprintf(L" %C \xe2\x95\x91 %C \xe2\x95\x91 %C \\n", pos[0], pos[1], pos[2]);\n    wprintf(L"\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\\n");\n    wprintf(L" %C \xe2\x95\x91 %C \xe2\x95\x91 %C \\n", pos[3], pos[4], pos[5]);\n    wprintf(L"\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\\n");\n    wprintf(L" %C \xe2\x95\x91 %C \xe2\x95\x91 %C \\n", pos[6], pos[7], pos[8]);\n    system("pause");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出(两种情况):

\n\n
 X \xe2\x95\x91 O \xe2\x95\x91 X\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n O \xe2\x95\x91 X \xe2\x95\x91 O\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n X \xe2\x95\x91 O \xe2\x95\x91 X\nPress any key to continue . . .\n
Run Code Online (Sandbox Code Playgroud)\n