Я разрабатывал консольную игру в шахматы на 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 note: Кажется, что Cygwin ведет себя по-разному, в зависимости от того, выбран ли у вас шрифт Raster или шрифт TTF. При использовании DejaVu Sans Mono для Cygwin оба параметра отображаются правильно.