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

标签 c++ windows unicode windows-console

我的代码:

#include <iostream>
#include <windows.h>

using namespace std;

int pos[9];

int main() {
    printf(" %c ║ %c ║ %c ", pos[0], pos[1], pos[2]);
    printf("═══╬═══╬═══");
    printf(" %c ║ %c ║ %c "), pos[3], pos[4], pos[5];
    printf("═══╬═══╬═══");
    printf(" %c ║ %c ║ %c "), pos[6], pos[7], pos[8];
    system("pause");
}

我的控制台输出:

Console

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

最佳答案

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

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>

int main()
{
    char pos[9] = {'X','O','X','O','X','O','X','O','X'};
    printf(" %c ║ %c ║ %c \n", pos[0], pos[1], pos[2]);
    printf("═══╬═══╬═══\n");
    printf(" %c ║ %c ║ %c \n", pos[3], pos[4], pos[5]);
    printf("═══╬═══╬═══\n");
    printf(" %c ║ %c ║ %c \n", pos[6], pos[7], pos[8]);
    system("pause");    system("pause");
}

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

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fcntl.h>

int main()
{
    char pos[9] = {'X','O','X','O','X','O','X','O','X'};
    _setmode(_fileno(stdout), _O_U16TEXT);
    wprintf(L" %C ║ %C ║ %C \n", pos[0], pos[1], pos[2]);
    wprintf(L"═══╬═══╬═══\n");
    wprintf(L" %C ║ %C ║ %C \n", pos[3], pos[4], pos[5]);
    wprintf(L"═══╬═══╬═══\n");
    wprintf(L" %C ║ %C ║ %C \n", pos[6], pos[7], pos[8]);
    system("pause");
}

输出(两种情况):

 X ║ O ║ X
═══╬═══╬═══
 O ║ X ║ O
═══╬═══╬═══
 X ║ O ║ X
Press any key to continue . . .

关于使用 printf 在控制台中使用 C++ unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549328/

相关文章:

c++ - 如何在 C++ 方法中定义常量字符串

c++ - 末端指针会与其他对象重叠吗?

c++ - 使用 &front() 修改 std::string 中的底层字符数组

ios - Unicode箭头与文本不同

Python:将 simplejson 转储的 unicode 日期时间转换回日期时间对象

c++ - 协助在 MFC 中从多字节移植到 UNICODE

c++ - 检查数字是否为质数

windows - 将 X11 显示转发到 Windows 时出现颜色问题

c# - 如何在WPF中闪烁RichTextBox边框和背景色

windows - cmd for 循环转义?在集合中?