我一直在用C++开发一款游戏机象棋游戏(使用MVS2010),我似乎遇到了一个我自己无法解决的问题。问题是,我需要在控制台中显示以下棋子:Unicode
我当然经历了大量的论坛,文章和文件,但仍然没有完成任务。我理解某些字符(特别是我需要的字符)不能使用Windows-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时,它打印的是一个空方块,而不是国际象棋。以下是国际象棋字符的链接: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;
}现在我所需要的似乎是找到一种能够显示我需要的字符的字体,但问题是,在启动应用程序时,我是否可以以编程方式配置控制台,使其能够显示这些符号?
提前感谢!
发布于 2015-08-13 22:37:25
我能够正确地展示棋子。主要问题是默认控制台字体不包括棋子的符号。您可以通过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的行为似乎有所不同,取决于您是否选择了Raster或TTF字体。使用DejaVu Sans也用于Cygwin,这两个选项都显示正确。
https://stackoverflow.com/questions/27483800
复制相似问题