首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows控制台中显示unicode棋子

在Windows控制台中显示unicode棋子
EN

Stack Overflow用户
提问于 2014-12-15 12:11:00
回答 1查看 4.9K关注 0票数 6

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

我当然经历了大量的论坛,文章和文件,但仍然没有完成任务。我理解某些字符(特别是我需要的字符)不能使用Windows-console提供的字体显示。但是控制台只支持几种字体:控制台和透明控制台。最后一个很好地显示了大量的字符,但不是所有的字符。下面的片段最符合我的需要:

代码语言:javascript
复制
#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时,它打印的是一个空方块,而不是国际象棋。以下是国际象棋字符的链接:http://unicode-table.com/ru/#geometric-shapes

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

代码语言:javascript
复制
#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;
}

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

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2015-08-13 22:37:25

我能够正确地展示棋子。主要问题是默认控制台字体不包括棋子的符号。您可以通过installing DejaVu Sans Mono将其修复为控制台字体。

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

使用UTF-16

代码语言:javascript
复制
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

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

Cygwin注意: Cygwin的行为似乎有所不同,取决于您是否选择了Raster或TTF字体。使用DejaVu Sans也用于Cygwin,这两个选项都显示正确。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27483800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档