在Windows控制台中显示unicode棋子 我在C++开发了一个控制台象棋游戏(使用MVS2010),我似乎遇到了一个我自己无法解决的问题。问题是我需要在控制台中显示以下棋子:

在Windows控制台中显示unicode棋子 我在C++开发了一个控制台象棋游戏(使用MVS2010),我似乎遇到了一个我自己无法解决的问题。问题是我需要在控制台中显示以下棋子: ,c++,visual-studio,unicode,console,chess,C++,Visual Studio,Unicode,Console,Chess,当然,我浏览了大量的论坛、文章和文档,但仍然没有完成任务。我知道有些字符(特别是我需要的字符)无法使用Windows控制台提供的字体显示。但console只支持几种字体:ConsoleAs和lucida console。最后一个适合显示大量字符,但不是所有字符。下面的代码片段最符合我的需要: #include <Windows.h> #include <wchar.h> int main() { UINT oldcp = GetConsoleOutputCP();

当然,我浏览了大量的论坛、文章和文档,但仍然没有完成任务。我知道有些字符(特别是我需要的字符)无法使用Windows控制台提供的字体显示。但console只支持几种字体:ConsoleAs和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;
}
#包括
#包括
int main()
{
UINT oldcp=GetConsoleOutputCP();
设置控制台输出CP(CP_UTF8);
wchar_t s[]=L“\x266B”;
int bufferSize=WideCharToMultiByte(CP_UTF8,0,s,-1,NULL,0,NULL,NULL);
char*m=新字符[bufferSize];
宽图表多字节(CP_UTF8,0,s,-1,m,bufferSize,NULL,NULL);
wprintf(L“%S”,m);
删除[]m;
设置控制台输出CP(旧CP);
返回0;
}
当使用它显示以下字符时,它起作用:\x266B(仅当使用Lucida console时)。但当我试图显示\x265B时,它会打印一个空方块而不是棋子。 以下是国际象棋角色的链接:

以下截取的代码更清晰、更小,其行为与上面的代码类似:

#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;
}
#包括
#包括
#包括
#包括
int main(){
//_setmode(_fileno(stdout),_O_u8文本);
//_setmode(_fileno(stdin),_O_u8文本);
_setmode(_fileno(stdout),_O_16text);
_设置模式(_fileno(stdin),_O_16text);
wchar_t*str=L“\x265B\n”;

std::wcout我能够正确显示棋子。主要问题是默认控制台字体不包括棋子的字形。您可以将其作为控制台字体来修复

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

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

使用UTF-8
Cygwin注意:Cygwin的行为似乎有所不同,这取决于您选择的是光栅字体还是TTF字体。使用Cygwin使用的DejaVu Sans Mono,这两个选项都可以正确显示。

您可以使用Charmap.exe小程序查看特定字体中有哪些字形可用。它会告诉您,您的机器没有使用有一个固定间距的字体,它定义了棋子字形。所以你得到了一个矩形。找到一个合适的字体将是一件困难的事情,请创建一个GUI应用程序。对我来说很有用,但我发现该字体已经移到了这里:。我注意到,通过更改为MS哥特式字体,字形会出现。无需单独下载font@DeanP我试过MSFONt、 但是字符似乎没有对齐&似乎不是等距的
HANDLE cons = GetStdHandle(STD_OUTPUT_HANDLE);
wchar_t p[] = L"Queen: \u265B.\n";
// wprintf(p);
DWORD n;
WriteConsoleW(cons, p, wcslen(p), &n, NULL );
SetConsoleOutputCP(65001);        // Command prompt UTF-8 code page
char q[] = "King: \xE2\x99\x94.\n";
printf(q);