1. ホーム
  2. c++

[解決済み] C++: プラットフォーム非依存でASCIIハートとダイヤを印刷する

2022-03-02 05:52:25

質問

カードゲームを開発しているのですが、ハート、ダイヤ、スペード、クラブのシンボルを印刷したいのです。 ターゲットプラットフォームは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の両方でハート、ダイヤ、スペード、クラブのシンボルをプリントアウトできる標準的なライブラリはないのでしょうか? これまで調べてきたのは、ユニコードが世界共通だと理解しているので、ユニコードに注目しています。

どのように解決するのですか?

もし、ポータブルな方法を望むなら、ユニコードのコードポイント(グリフが関連付けられて定義されている)を使用することです。

♠ 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

ASCIIの32文字以下は、すべて 制御文字 . これらの文字には意味があり、そこにグリフや動作が得られる保証はありません (ほとんどの制御文字にはグリフがありますが、印刷可能な文字として意図されたものではありません)。それでも、安全とは言えません。

しかし、ユニコードを使用するには、適切なフォントとエンコーディングのサポートが必要で、これはUNIX-likeでは問題ないかもしれません。

Windows では、コンソールがラスターフォントに設定されている場合、上記のコードポイントの少なくともいくつかは、出力する ASCII 制御文字グリフにマップされます (したがって、ユニコードや現在設定されている OEM コードページ以外のものをサポートしていません)。これは黒のバリエーションにのみ適用され、白のバリエーションには同等のものがありません。