Visual Studio C++ C2022。尝试打印 Unicode 字符时出现字符太大错误

Visual Studio C++ C2022. Too big for character error occurs when trying to print a Unicode character

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

#include <iostream>

int main() {
    std::cout << "\x2713";
    return 0;
}

很简单,\x2713对于单个字符来说太大了。如果你想要两个字符,你需要做 \x27\x13,如果你想要宽字符,那么你需要用 L 作为前缀,即 L"\x2713",然后使用 std::wcout 代替std::cout.

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

The escape \ooo consists of the backslash followed by one, two, or three octal digits that are taken to specify the value of the desired character. The escape \xhhh consists of the backslash followed by x followed by one or more hexadecimal digits that are taken to specify the value of the desired character. There is no limit to the number of digits in a hexadecimal sequence. A sequence of octal or hexadecimal digits is terminated by the first character that is not an octal digit or a hexadecimal digit, respectively. The value of a character-literal is implementation-defined if it falls outside of the implementation-defined range defined for char (for character-literals with no prefix) or wchar_t (for character-literals prefixed by L).

从本质上讲,编译器可以按照自己的意愿处理该字符; g++ issues a warning, and MSVC (for me) is a compiler error (clang also treats as an error)

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

给出

如果您要对 Unicode 代码点进行编码,语法为 \uNNNN(恰好 4 位数字)或 \UNNNNNNNN(恰好 8 位数字)。请注意,这是代码点,而不是 UTF 表示。

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

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

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

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

如果没有编码前缀,则由编译器(我认为)以何种方式对代码点进行编码。

参见: