C ++: Печать ASCII Heart and Diamonds с независимой платформой - PullRequest
5 голосов
/ 19 января 2010

Я разрабатываю карточную игру и хочу напечатать символ сердца, бриллиантов, пиков и треф. Моя целевая платформа будет 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, поскольку, насколько я понимаю, это универсально.

Спасибо за любую оказанную помощь.

Ответы [ 4 ]

12 голосов
/ 19 января 2010

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

♠ 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-подобных.

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

8 голосов
/ 19 января 2010

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

#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;
}
1 голос
/ 22 августа 2015

Верхний ответ устарел или был неправильным.

ASCII-коды для клюшек, бриллиантов, сердец, пиков теперь '\5', '\4', '\3', '\6' соответственно.

1 голос
/ 19 января 2010

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

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

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

Итог: все зависит от шрифта, и не существует гарантированного портативного способа добиться этого без добавления собственных гильфов.

...