[英]GetComputerName() not displaying Unicode correctly in Windows console
[英]Displaying unicode chess pieces in Windows-console
我一直在用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时,它会打印一个空方块而不是棋子。 以下是国际象棋角色的链接: 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;
}
现在我需要的只是找出一个可以显示我需要的字符的字体,但问题是我可以在启动应用程序时以编程方式配置控制台以使其能够显示这些符号吗?
提前致谢!
我能够正确地显示国际象棋棋子。 主要问题是默认控制台字体不包括国际象棋棋子的字形。 你可以通过安装DejaVu Sans Mono作为控制台字体来解决这个问题。
在这之后,有两种可能的方法(我使用的是MinGW-w64)。
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通过这些程序。
SetConsoleOutputCP(65001); // Command prompt UTF-8 code page
char q[] = "King: \xE2\x99\x94.\n";
printf(q);
Cygwin注意: Cygwin的行为似乎有所不同,具体取决于您是选择了Raster Font还是TTF字体。 DejaVu Sans Mono也用于Cygwin,两个选项都正确显示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.