如何使用C++在Linux终端中显示Unicode字符?

9

我正在Linux环境下使用C++开发国际象棋游戏,并希望在Bash终端中使用Unicode字符显示棋子。是否有办法使用cout输出符号?

以下是输出骑士的示例:♞ = U+265E。


2
请记住,即使您发送了UTF-8/16的正确字节,也不能保证用户的tty支持Unicode,即使它支持,也不能保证它有包含这些字符的字体。 - Nick Bastin
1
我的问题是如何发送正确的字节 :) 我的终端支持Unicode字符,目前我并不关心它在其他环境中是否正常。 - Lipis
2个回答

9

要输出Unicode字符,您只需使用输出流,就像输出ASCII字符一样。您可以将Unicode码点存储为多字符字符串:

 std::string str = "\u265E";
 std::cout << str << std::endl;

如果您想输出一个ASCII范围之上的单个Unicode字符,使用宽字符输出也是方便的。

 setlocale(LC_ALL, "en_US.UTF-8");
 wchar_t codepoint = 0x265E;
 std::wcout << codepoint << std::endl;

然而,正如其他人所指出的那样,这是否正确显示取决于用户环境中的许多因素,例如用户的终端是否支持Unicode显示、用户是否安装了适当的字体等。这对于大多数预装主流发行版(如安装有Gnome的Ubuntu/Debian)来说不应该是问题,但不要期望它能在任何地方都起作用。


在 GNOME 中,转到“编辑”→“配置文件首选项”,然后在“常规”选项卡下确保您正在使用的字体支持特殊字符。等宽字体可能无法正常工作,但像 DejaVu Sans Mono 或 Droid Sans Mono 这样的字体可以。 - Tom
注意:对于我来说,我只需要 setlocale(LC_ALL, "en_US.UTF-8"); 然后,我甚至可以使用原始的 wchar_t 字符。 - Andrew

4

抱歉,一开始误解了您的问题。这段代码在终端中打印出一个白色的国王(我在KDE Konsole中测试过)。

#include <iostream>

int main(int argc, char* argv[])
{
std::cout <<"\xe2\x99\x94"<<std::endl;
return 0;
}

通常情况下,编码是通过区域设置来指定的。尝试设置环境变量。

In order to tell applications to use UTF-8 encoding, and assuming U.S. English is your preferred language, you could use the following command:

export LC_ALL=en_US.UTF-8
你是使用“裸”终端还是运行在X-Server下的终端?

我正在使用Ubuntu 8.04上的bash终端,它绝对支持Unicode符号。 - Lipis
抱歉,一开始误解了你的问题。现在修改了我的答案以反映它。 - Muxecoid
谢谢!这是另一种解决方案,但我只能接受一个答案! - Lipis

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