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

dif*_*ent 7 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我所提到的,心脏符号不会在Linux中打印出来.是否有标准库可用于在Linux和Windows中打印出心形,钻石,黑桃和俱乐部的符号?到目前为止我一直在研究的是查看Unicode,因为我的理解是这是普遍的.

感谢您提供的任何帮助.

Joe*_*oey 13

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

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

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

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

  • "♠U + 2660黑色太空服"是我曾经见过的有趣的错别字之一. (11认同)

Jas*_*rff 8

在Linux上,您几乎总是可以将UTF-8写入stdout,并且Unicode字符将显示得很漂亮.

#include <iostream>

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

int main() {
    std::cout << heart << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在像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;
}
Run Code Online (Sandbox Code Playgroud)