【问题标题】:How to print out ≠ to terminal using g++?如何使用g ++打印≠到终端?
【发布时间】:2019-01-18 13:03:48
【问题描述】:

我想在终端打印。我试过了

cout << '\u2248' << endl;
cout << '\U00002248' << endl;
cout << '≠' << endl;

给了

14846344
14846344
14846368

我尝试用双引号替换单引号

Ôëê
Ôëê
Ôëá

怎么做?我很好奇我得到的输出的解释是什么?我正在运行 Netbeans 9,但也直接从命令行使用 g++ 进行了测试。我认为这应该是可能的,因为echo ≠ 在 Windows 命令提示符下产生了正确的输出。

【问题讨论】:

  • 两件事:首先,多字符文字是特定于实现的东西。使用宽字符文字或字符串。其次,既然你提到了 MinGW,我猜你是在 Windows 上,而 Windows 控制台历来在 Unicode 方面非常糟糕(或者实际上不在当前选择的代码页中)。
  • @Someprogrammerdude “使用宽字符文字或字符串。”这就是我通过将它们放在双引号中所做的吗?我还尝试在前面添加L,它的输出不同但仍然错误。
  • 尝试使用 UnicodeString 或 AnsiString 类型来声明字符串。它可能会起作用
  • @EdinHajdarevic 这些是 Borland C++ / Embarcadero RAD Studio 特定的类,因此非常非标准。

标签: c++ netbeans g++ mingw special-characters


【解决方案1】:

因此,在 C++ 中,就像在普通 C 中一样,默认情况下我们只能使用 ASCII 字符。 Char 变量仅包含 8 位(1 个字节)来存储值,因此最多 - 2^8=256 个不同的符号可以由一个 char 变量编码。 单引号(如 'a')存储 char 变量,因此在其中可以仅放置 ASCII 字符。您的字符不是 ASCII 表的一部分,我们需要更改编码。

对于仅打印(而不是存储/处理)您的字符,您应该使用另一种编码,例如 UTF-8。您可以通过编程方式完成:

std::setlocale(LC_ALL, /*some system-specific locale name, probably */ "en_US.UTF-8");
std::cout << "\u2260" << std::endl;

或通过 g++ 的命令行选项(例如 -finput-charset=UTF-16)。 如您所见,我使用双引号将非 ASCII 符号打印到控制台。

【讨论】:

  • 这不起作用。我认为有一个错误/未实现的功能,MinGW 不支持更改语言环境。
  • 是的,@northerner,你是对的。对于 MinGW std::setlocale 没有实现。但是,您可以使用 setlocale(LC_ALL, "en_US.UTF-8"); 来代替它——它是 C 风格的函数,也可以在 C++ 中使用。
  • 在我的 MinGW 情况下,此代码工作正常:_setmode(_fileno(stdout), 0x00020000); std::wcout &lt;&lt; L"\u2260" &lt;&lt; std::endl; 包括
  • 我收到错误_fileno was not declared in this scope
  • 感谢工作,我想我忘了包括正确的标题。
猜你喜欢
  • 2013-06-27
  • 2013-09-14
  • 2015-11-04
  • 2022-11-02
  • 2020-02-24
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多