我最近才意识到,C++17中的u8
字符前缀并不是针对所有UTF8代码点,而只是针对ASCII部分。
来自cppreference。
UTF-8字符字面量,例如
u8'a'
。这样的字面量具有char
类型和值等于c-char的ISO 10646代码点值(假设代码点值可以用单个UTF-8代码单元表示)。如果c-char不在基本拉丁或C0控制Unicode块中,则程序无效。
auto hello = u8'嗨'; // ill-formed
auto world = u8"世"; // not a character
auto what = 0xE7958C; // almost human-readable
auto wrong = u8"錯"[0]; // not even correct
如何简洁地获取UTF8代码点文字?编辑:对于想知道UTF8代码点如何存储的人,我发现一种合理的方法是像 Golang的方式那样。基本思想是在仅需要一个代码点时,将单个代码点存储在32位类型中。编辑2:根据有用的评论所述的论点,没有理由让编码的UTF8始终保留在32位类型中。可以将其解码,这将是utf32,并带有前缀
U
,或者将其编码为字符串,并带有前缀 u8
。
u8
(通过编译检查)保证了相应代码点的UTF-8编码适合1个字节。如果您需要其他代码点的UTF-8序列...嗯...使用U
前缀进行编码,然后像往常一样将其转换为字符序列(例如通过函数)?我相信我知道你为什么问了... - Scheff's Cat