- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在用 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 时,它打印出一个空方 block 而不是棋子。这是国际象棋角色的链接: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;
}
看来我现在需要的只是找到一种可以显示我需要的字符的字体,但问题是我可以在启动应用程序时以编程方式配置控制台以使其能够显示这些符号吗?
提前致谢!
最佳答案
我能够正确显示棋子。主要问题是默认的控制台字体不包括棋子的字形。您可以通过 installing 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 的行为似乎有所不同,具体取决于您选择的是光栅字体还是 TTF 字体。 DejaVu Sans Mono 也用于 Cygwin,这两个选项都能正确显示。
关于c++ - 在 Windows 控制台中显示 unicode 棋子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483800/
我正在尝试使用 GUI 的 NetBeans IDE 在 Java 中制作国际象棋游戏,但我无法使棋子停留在棋盘上方,当我尝试时,棋盘就会被推开。我对这两个图像都使用了标签。如何让棋子停留在棋盘上方而
编辑:要查看JS函数的工作版本,see the accepted answer in this followup thread 编辑:我使用的最终正则表达式是这样的: var pattern = /(
我一直在用 C++(使用 MVS2010)开发一个控制台国际象棋游戏,我似乎遇到了一个我自己无法解决的问题。问题是我需要在控制台中显示以下棋子: http://en.wikipedia.org/wik
我正在尝试用 Java 编写自己的国际象棋游戏。我已经开始编写类(class),我的高级想法如下: 我有一个包含这些字段的 Piece 类: private String name; private
我是一名优秀的程序员,十分优秀!