视觉工作室C++ C2022.尝试打印 Unicode 字符时出现太大而无法字符的错误



当我尝试打印一个 Unicode 字符到控制台时。Visual Studio给了我一个错误。如何解决此问题并让Visual Studio打印Unicode字符?

#include <iostream>
int main() {
std::cout << "x2713";
return 0;
}

很简单,x2713对于单个字符来说太大了。如果你想要两个字符,你需要做x27x13,如果你想要宽字符,那么你需要用L前缀,即L"x2713",然后使用std::wcout而不是std::cout

请注意,从C++20标准(草案)[lex.ccon]/7(强调我的):

转义 \ooo 由反斜杠组成,后跟一个、两个或三个八进制数字,用于指定所需字符的值。转义 \xhhh 由反斜杠后跟 x 后跟一个或多个十六进制数字组成,用于指定所需字符的值。十六进制序列中的位数没有限制。八进制或十六进制数字序列分别由第一个不是八进制数字或十六进制数字的字符终止。如果字符文本的值超出为 char(对于没有前缀的字符文本)或wchar_t(对于以 L 为前缀的字符文本)定义的实现定义范围,则该值是实现定义的

从本质上讲,编译器可以随心所欲地处理该字符;g++ 发出警告,MSVC(对我来说)是编译器错误(clang 也被视为错误)。

xNNN(任何正数的十六进制数字)表示一个字节,其值由NNN给出;除非在字符串文字或字符文字中以L为前缀,在这种情况下,它表示值由NNN给出的wchar_t

如果要对 Unicode 代码点进行编码,语法uNNNN(正好 4 位)或UNNNNNNNN(正好 8 位)。 请注意,这是代码点,而不是 UTF 表示形式。

使用uU表单而不是L避免了由于wchar_t在不同平台上具有不同大小而导致的可移植性问题。

要获得明确定义的行为,您可以手动指定字符串文字的编码,例如:

std::cout << u8"u2713" << std::endl;

这会将代码点编码为 UTF-8。 当然,您仍然需要一个 UTF-8 感知终端才能看到有意义的输出。

如果没有编码前缀,那么编译器(我认为)以何种方式对代码点进行编码取决于。

看:

  • 转义序列
  • 字符串文本

最新更新