C ++:使用平台独立打印ASCII心和钻石

时间:2010-01-19 15:01:33

标签: c++ unicode 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,因为我的理解是这是普遍的。

感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:12)

如果您想要一种可移植的方式,那么您应该使用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

请记住,ASCII中字符32下面的所有内容都是控制字符。它们具有与它们相关的含义,并且您无法保证在其中获得字形或行为(即使大多数控制字符具有字形,尽管它们从不打算打印)。不过,这不是一个安全的赌注。

但是,使用Unicode需要适当的字体和编码支持,这可能是也可能不是UNIX喜欢的问题。

在Windows上,如果控制台设置为光栅字体(因此不支持Unicode或当前设置的OEM代码页以外的任何其他内容),则至少上述某些代码点会映射到您输出的ASCII控制字符字形。这仅适用于黑色变体,因为白色变体没有等效变体。

答案 1 :(得分:8)

在Linux上,您几乎总是可以将UTF-8写入stdout,并且Unicode字符将以精美的方式显示。

#include <iostream>

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

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

您可以在fileformat.info等网站上找到UTF-8 Unicode字符编码(搜索该页面为“UTF-8(hex)”)。

另一种方法是使用宽字符。您首先需要致电setlocale进行设置。然后,只需使用wchar_t代替charwcout代替cout

#include <iostream>
#include <clocale>

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

int main() {
    setlocale(LC_ALL, "");
    std::wcout << heart << L'\n';
    return 0;
}

答案 2 :(得分:1)

这不是图书馆的问题,而是您正在使用的字体代码页的问题。

如果您正在运行的终端使用的字体在其当前代码页中没有心形和菱形,则没有库可以帮助您 - 您必须使用图形。

为了进一步阅读,我试图在Unicode Tables中找到它 - 但是,unicode终端是罕见的...即使你有一个Unicode字体,也不能保证它会有卡 - 里面的图像。

底线:这一切都取决于字体,并且没有保证可移植的方式来实现它而不需要自己的gylphs。

答案 3 :(得分:1)

最佳答案现已过时或不正确。

俱乐部,钻石,心形,黑桃的ASCII代码现在分别为'\5', '\4', '\3', '\6'