尝试实现C++代码,使我们可以使用非UTF-8字符作为std :: string内的分隔符。
是否存在非UTF-8字符?
是的。0xC0、0xC1、0xF5、0xF6、0xF7、0xF8、0xF9、0xFA、0xFB、0xFC、0xFD、0xFE、0xFF都是无效的UTF-8编码单元。UTF-8编码单元为8位。如果您所说的char
是指8位字节,则无效的UTF-8编码单元将是在UTF-8编码文本中不存在的char
值。
std::string
只知道原始的 char
值,它不了解使用 char
保存编码值的特定字符编码。
许多常见的 UTF-8 实现使用 char
来保存编码的代码单元(尽管 C++20 将引入 char8_t
和 std::u8string
替代此目的)。但其他字符编码(Windows-12##、ISO-8859-# 等)也可以将它们的编码值适配到 char
元素中。
任何落在 ASCII 范围内的 char
值(0x00 .. 0x7F)都能适配到一个 char
中,并映射到 Unicode 中相同的代码点值(U+0000 .. U+007F),但是在 ANSI 范围内而不在 ASCII 范围内(0x80 .. 0xFF)的任何 char
值都取决于创建 char
值的任何字符编码的解释。有些编码库每个字符使用1个char
,而另一些则需要使用多个 char
。
所以,在某些情况下还是存在“非UTF-8字符”的。
char
。 - Anonymous Anonymouschar
,没错。但是UTF-8是一个8位编码,而char
可能是有符号的或无符号的,这取决于编译器的实现。在有符号的情况下,任何Unicode代码点上面U+007F的所有代码单元都将占用每个char
的符号位。此外,请注意,虽然char
保证大小为1字节,但并不是所有平台都保证一个字节是8位(尽管在大多数平台上是如此)-请参见limits.h
中的CHAR_BIT
。另一方面,UTF-7可以很好地适应一个char
字符串,而不需要使用符号位。 - Remy Lebeau