存在非 UTF-8 字符吗?

9

尝试实现C++代码,使我们可以使用非UTF-8字符作为std :: string内的分隔符。

是否存在非UTF-8字符?

3个回答

7

是的。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值。


3

std::string 只知道原始的 char 值,它不了解使用 char 保存编码值的特定字符编码。

许多常见的 UTF-8 实现使用 char 来保存编码的代码单元(尽管 C++20 将引入 char8_tstd::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字符”的。


但是C++标准仍然要求char具有确切的1字节大小。假设标准8位= 1字节,任何utf8-char都将始终适合于char - Anonymous Anonymous
一个UTF-8编码的代码单元可以适应一个char,没错。但是UTF-8是一个8位编码,而char可能是有符号的无符号的,这取决于编译器的实现。在有符号的情况下,任何Unicode代码点上面U+007F的所有代码单元都将占用每个char的符号位。此外,请注意,虽然char保证大小为1字节,但并不是所有平台都保证一个字节是8位(尽管在大多数平台上是如此)-请参见limits.h中的CHAR_BIT。另一方面,UTF-7可以很好地适应一个char字符串,而不需要使用符号位。 - Remy Lebeau

0
你可以查看维基上的UTF-8标准。并不是每个字节序列都是有效的UTF-8字符。即使只有一个字节:0x11111000,0x11111111也不是UTF-8中有效的第一个字节。
虽然如此,我怀疑使用非UTF-8字符作为分隔符可能不是一个好主意。你可能会发现某些程序(如Notepad++)在读取字符串输出时出现问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接