尝试实现 c++ 代码,我们可以使用非 utf8 字符作为 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 范围 (0x00 .. 0x7F( 内的char
值都将适合 1char
并映射到 Unicode 中的相同代码点值 (U+0000 ..U+007F(,但 ANSI 范围内但不在 ASCII 范围 (0x80 .. 0xFF( 中的任何char
值都可以通过创建char
值的任何字符编码进行解释。 有些编码每个字符使用 1 个char
,有些使用多个char
。
所以是的,有"非 UTF-8 字符"这样的东西。
您可以在 Wiki 上查看 UTF-8 标准。并非每个字节序列都是有效的 UTF-8 字符。即使它是单字节:0x11111000,0x11111111也不是 UTF-8 格式的有效第一个字节。
不过,我怀疑使用非 UTF-8 字符作为分隔符是个好主意。您可能会发现某些程序(如记事本++(在读取字符串输出时出现问题。