gpt4 book ai didi

c++ - 在 Windows 控制台中显示 unicode 棋子

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:56 29 4
gpt4 key购买 nike

我一直在用 C++(使用 MVS2010)开发一个控制台国际象棋游戏,我似乎遇到了一个我自己无法解决的问题。问题是我需要在控制台中显示以下棋子: http://en.wikipedia.org/wiki/Chess_symbols_in_Unicode

我当然浏览了大量的论坛、文章和文档,但仍然没有完成任务。我知道某些字符(特别是我需要的字符)无法使用 Windows 控制台提供的字体显示。但是控制台只支持几种字体:consolas 和 lucida console。最后一个足以显示大量字符,但不是全部。下面的片段是最接近我需要的片段之一:

#include <Windows.h>
#include <wchar.h>
int main()
{
UINT oldcp = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);

wchar_t s[] = L"\x266B";
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize];
WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
wprintf(L"%S", m);
delete[] m;

SetConsoleOutputCP(oldcp);

return 0;
}

当使用它来显示以下字符时,它可以工作:\x266B(仅当使用 Lucida 控制台时)。但是当我尝试显示\x265B 时,它打印出一个空方 block 而不是棋子。这是国际象棋角色的链接:http://unicode-table.com/ru/#geometric-shapes

下面的代码片段更清晰、更小,并且与上面的代码类似:

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <Windows.h>
int main(){

//_setmode(_fileno(stdout), _O_U8TEXT);
//_setmode(_fileno(stdin), _O_U8TEXT);

_setmode(_fileno(stdout), _O_U16TEXT);
_setmode(_fileno(stdin), _O_U16TEXT);

wchar_t * str=L"\x265B\n";
std::wcout<<str<<std::endl;
return 0;
}

看来我现在需要的只是找到一种可以显示我需要的字符的字体,但问题是我可以在启动应用程序时以编程方式配置控制台以使其能够显示这些符号吗?

提前致谢!

最佳答案

我能够正确显示棋子。主要问题是默认的控制台字体不包括棋子的字形。您可以通过 installing DejaVu Sans Mono 修复它作为控制台字体。

这样做之后,有两种可能的方法(我使用的是 MinGW-w64)。

使用UTF-16

HANDLE cons = GetStdHandle(STD_OUTPUT_HANDLE);
wchar_t p[] = L"Queen: \u265B.\n";
// wprintf(p);
DWORD n;
WriteConsoleW(cons, p, wcslen(p), &n, NULL );

请注意,wprintf 不起作用。我相信这是因为 MS 的控制台例程很糟糕,而 MinGW 会通过这些例程进行路由。

使用 UTF-8

SetConsoleOutputCP(65001);        // Command prompt UTF-8 code page
char q[] = "King: \xE2\x99\x94.\n";
printf(q);

Cygwin 注释:Cygwin 的行为似乎有所不同,具体取决于您选择的是光栅字体还是 TTF 字体。 DejaVu Sans Mono 也用于 Cygwin,这两个选项都能正确显示。

关于c++ - 在 Windows 控制台中显示 unicode 棋子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483800/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com