在 Windows 控制台中显示 unicode 棋子

ant*_*oev 6 c++ unicode console chess visual-studio

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

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

当使用它显示以下字符时,它起作用:\x266B(仅在使用 Lucida 控制台时)。但是当我尝试显示 \x265B 时,它会打印一个空方块而不是棋子。这是国际象棋字符的链接: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;
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

M.M*_*M.M 6

我能够正确显示棋子。主要问题是默认的控制台字体不包括棋子的字形。您可以通过安装 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 );
Run Code Online (Sandbox Code Playgroud)

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

使用 UTF-8

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

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