C++: печать основы ASCII и ромбов с независимым от платформы

Я разрабатываю игру играющего карты и хотел бы распечатать символ для основ, ромбов, лопат и клубов. Моей целевой платформой будет Linux.

В Windows я знаю, как распечатать эти символы. Например, для распечатывания основы (в ASCII) я записал...

// in Windows, print a ASCII Heart

#include <iostream>

using std::cout;
using std::endl;

int main()
{
 char foo = '\3';
 cout << heart << endl;
 system ( "PAUSE" );
 return 0;
}

Однако когда я сослался на, сердечный символ не будет распечатан в Linux. Существует ли стандартная библиотека, которой можно пользоваться для распечатывания символа для основ, ромбов, лопат и клубов и в Linux и в Windows? Что я исследовал, до сих пор смотрит на Unicode, так как это - мое понимание, что это универсально.

7
задан genpfault 22 November 2019 в 20:06
поделиться

3 ответа

- 4594742-

Если вы хотите портативный способ, то вам следует использовать точки кода Unicode (которые определены с ними связанные с Glyphs):

♠ U+2660 Black Spade Suit
♡ U+2661 White Heart Suit
♢ U+2662 White Diamond Suit
♣ U+2663 Black Club Suit
♤ U+2664 White Spade Suit
♥ U+2665 Black Heart Suit
♦ U+2666 Black Diamond Suit
♧ U+2667 White Club Suit

Помните, что все ниже 32 в ASCII контрольный персонаж . У них есть смысл, связанный с ними, и у вас нет гарантии получения глифа или поведения там (хотя большинство контрольных символов имеют глифы, хотя они никогда не были предназначены для печати). Тем не менее, это не безопасная ставка.

Однако использование Unicode требует правильного шрифта и поддержки кодирования, которая может быть или не может быть проблемой на Unix-Likes.

В Windows, по крайней мере, некоторые из вышеуказанных кодовых точек отображают карту символа управления ASCII, вы выводят, если консоль устанавливается на растровые шрифты (и, следовательно, не поддерживать Unicode или что-то еще, чем в текущем наборе данных OEM-кода). Это относится только к черными вариантам, так как белые не имеют эквивалента.

13
ответ дан 6 December 2019 в 07:50
поделиться

В Linux вы почти всегда можете писать UTF-8 на STDOUT и символы Unicode будут выглядеть красиво.

#include <iostream>

const char heart[] = "\xe2\x99\xa5";

int main() {
    std::cout << heart << '\n';
    return 0;
}

Вы можете найти кодировки UTF-8 символов Unicode на таких сайтах, как FileFormat.info (поиск этой страницы для «UTF-8 (Hex)»).

Еще один способ использовать широкие символы. Вам сначала нужно позвонить SetLocale , чтобы настроить вещи. Тогда просто используйте wchar_t вместо Char и WCOUT вместо Cout .

#include <iostream>
#include <clocale>

const wchar_t heart[] = L"\u2665";

int main() {
    setlocale(LC_ALL, "");
    std::wcout << heart << L'\n';
    return 0;
}
8
ответ дан 6 December 2019 в 07:50
поделиться

Это не вопрос библиотеки, речь идет о кодовой странице шрифта, который вы используете.

, если шрифт, используемый для Терминал, у которого у вас нет сердца и бриллиантов в текущем кодовой странице, ни одна библиотека не поможет вам - вам придется использовать графику.

Для дальнейшего чтения я бы попытался найти его, может быть, в таблиц Unicode - однако, клеммы Unicode являются редки ... и даже если у вас есть шрифт Unicode, нет никакой гарантии, что это будет есть карточные изображения в нем.

Нижняя строка: Все зависит от шрифта, и нет гарантированного портативного способа для достижения его без подачи собственных Gylphs.

1
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: