打印 C++ 中的笑脸表情

4
我试图根据用户的要求,基于ascii码打印笑脸,但在控制台输出屏幕上,只显示一个内部有另一个正方形的正方形。我错在哪里了?
#include <iostream>
using namespace std;
int main()
{
    int smile;

    cout << "How many smiley faces do you want to see? ";
    cin >> smile;

    for (int i = 0; i < smile; i++)
    {
        cout << static_cast<char>(1) << "\t";
    }
    cout << endl;
    return 0;
}

5
请问您想知道这段代码 cout << static_cast<char>(1) << "\t"; 的作用及原因是什么? - Baum mit Augen
3
ASCII字符集中没有笑脸符号。编码为1的字符是不可打印的。 - Benjamin Lindley
1
:-( :-( :-( :-( :-( - Lee Taylor
2个回答

7
ASCII 没有表情符号(所以在 ASCII 中你会看到 :-),并期望读者将其理解为一个笑脸)。但是 Unicode 有几个表情符号,比如 ☺(white smiling face, U+263A);请参见 http://unicodeemoticons.com/http://www.unicode.org/emoji/charts/emoji-list.html 获取漂亮的表情符号表格。
在2017年,合理地使用UTF8 everywhere(在终端和输出中)。UTF-8Unicode的一种非常常见的编码方式,许多Unicode字符在UTF-8中被编码为多个字节。
因此,在使用具有许多字符可用的字体的UTF8终端中,由于☺在UTF8中被编码为"\342\230\272",请使用:
for (int i = 0; i < smile; i++)
{
    cout << "\342\230\272" << "\t";
}

在2017年,大多数“控制台”都是终端模拟器,因为真正的终端(如神话般的VT100)今天已经在博物馆里了,你至少可以配置这些终端模拟器使用UTF-8编码。在许多操作系统上(特别是大多数Linux发行版和MacOSX),它们默认使用UTF-8。

如果您的C++11编译器接受字符串中的UTF8(以及UTF8源文件),就像大多数现在所做的那样,您甚至可以在源代码中使用"☺"。为了输入这个字符,你通常会使用一些从外部来源复制和粘贴的技巧。在我的Linux系统上,我经常使用一些字符映射实用程序(例如在终端中运行charmap)来获取它们。

ASCII 中,编码为1的字符是一个控制字符,即正文开始。也许你将ASCII与CP437混淆了,后者已不再使用(但在1980年代编码了一个笑脸形状的东西,位于编码1处)。

您需要使用Unicode并理解它。在今天的2017年,您不能承受使用其他编码(它们是历史遗留物,适合博物馆使用)。当然,如果您使用奇怪的字符,您应该记录程序用户应该使用一些具有这些字符的字体(但大多数终端模拟器中使用的常见字体接受Unicode的很大一部分,因此在实践中这不是问题)。然而,在我的Linux计算机上,许多字体缺少U+1F642 微笑脸(例如C++程序中的"\360\267\231\202"),它仅出现在2014年的Unicode7.0中。


在我的PC XT上打印字符代码1会生成不同颜色的笑脸。我有一个名为“Snipes”的游戏使用了这些字符。 - M.M
是的,可能是我提到的CP437编码。 - Basile Starynkevitch
我从未使用过Windows。有人知道最近的Windows控制台是否默认为UTF8吗? - Basile Starynkevitch
@Basile Starynkevitch 是的:不过你可以在新版Windows上使用命令CHCP 65001切换到UTF8模式。但是只有当你使用字体_Lucida_Console_或_Consolas_时,而不是_raster_font_。 - Lorinczy Zsigmond
我喜欢它。但是有没有办法在控制台中将它变得更大? - Azurespot

0

在Visual Studio Code中只需要这样做:

for print;
cout<<"\2";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接