char、wchar_t、char8_t、char16_t、char32_t

类型 charwchar_tchar8_tchar16_tchar32_t 是内置类型,可表示字母数字字符,非字母数字字形和非打印字符。

语法

char     ch1{ 'a' };  // or { u8'a' }
wchar_t  ch2{ L'a' };
char16_t ch3{ u'a' };
char32_t ch4{ U'a' };

备注

char 类型是 C 和 C++ 中的原始字符类型。 char 类型可用于存储 ASCII 字符集或任何 ISO-8859 字符集中的字符,以及多字节字符的单个字节,例如 Shift-JIS 或 Unicode 字符集的 UTF-8 编码。 在 Microsoft 编译器中,char 是 8 位类型。 它是与 signed charunsigned char 都不同的类型。 默认情况下,char 类型的变量将提升到 int,就像是从 signed char 类型一样,除非使用 /J 编译器选项。 在 /J 的情况下,它们被视为 unsigned char 类型并提升为 int (没有符号扩展)。

类型 unsigned char 通常用于表示 byte,它不是 C++ 中的内置类型。

wchar_t 类型是实现定义的宽字符类型。 在 Microsoft 编译器中,它表示一个 16 位宽字符,用于存储编码为 UTF-16LE 的 Unicode(Windows 操作系统上的本机字符类型)。 通用 C 运行时 (UCRT) 库函数的宽字符版本使用 wchar_t 及其指针和数组类型作为参数和返回值,本机 Windows API 的宽字符版本也是如此。

char8_tchar16_tchar32_t 类型分别表示 8 位、16 位和 32 位宽字符。 (char8_t 是 C++20 中的新增功能,需要 /std:c++20/std:c++latest 编译器选项。)编码为 UTF-8 的 Unicode 可以存储在 char8_t 类型中。 char8_tchar 类型的字符串称为“窄”字符串,即使用于编码 Unicode 或多字节字符。 编码为 UTF-16 的 Unicode 可以存储在 char16_t 类型中,而编码为 UTF-32 的 Unicode 可以存储在 char32_t 类型中。 这些类型和 wchar_t 类型的字符串都称为“宽”字符串,但该术语通常特指 wchar_t 类型的字符串。

在 C++ 标准库中,basic_string 类型专用于窄字符串和宽字符串。 字符的类型为 char 时,使用 std::string;字符的类型为 char8_t 时,使用 std::u8string;字符的类型为 char16_t 时,使用 std::u16string;字符的类型为 char32_t 时,使用 std::u32string;而字符的类型为 wchar_t 时,使用 std::wstring。 其他表示文本的类型(包括 std::stringstreamstd::cout)均可专用于窄字符串和宽字符串。