在CPP参考文档文档中,我注意到对于
char
,字符类型足够大以表示任何UTF-8八位代码单元(自C++14起),而对于char8_t
,它是用于UTF-8字符表示的类型,要求足够大以表示任何UTF-8代码单元(8位)。这是否意味着两者是相同的类型?还是char8_t
有其他特征?
char8_t
是一个8位类型。此外,char
的符号取决于编译器和目标平台:ARM和PowerPC的默认值通常为无符号,而x86和x64的默认值通常为有符号。与此不同的是,char8_t
始终为无符号类型。 - Elliott Frischchar8_t
字符串始终包含 UTF-8 文本(除非存在错误),而在没有额外环境知识的情况下,假定char
字符串的任何特定编码则不太安全。 - Miralchar
类型,像许多C++的C遗产一样,一直以来都非常令人讨厌和不靠谱。你不知道它是符号位还是非符号位,严格来说你甚至不知道它有多少位(尽管8位是一个相当安全的猜测,但绝无任何保证)。char8_t
类型提供了这两个保证。不幸的是,没有人有勇气简单地“修复”已经破损的原始类型(虽然这可能会破坏现有代码,但现代C++与传统C++不兼容,所以有什么关系...)。就像没有人费心将size_t
或ptrdiff_t
变成一个“适当”的类型一样。 - Damonchar8_t
精确为八位,所以在这方面没有发生任何变化... - Holgerchar
至少有8个位。POSIX和大多数其他系统(如Windows)保证char
恰好是8位。但C并没有说“是的,什么什么POSIX”。 POSIX包含了C标准,而不是相反。除非C突然决定疏远其巨大的用户群,否则他们不会强制规定恰好有8个位的类型,因为C是用于编写所有现代嵌入式/特定领域硬件的主要语言,这些硬件的字节比8位大。 - mtraceur