【发布时间】:2020-04-28 16:42:34
【问题描述】:
如何获得正确的 std::u8string 长度? (在 C++20 中) 我尝试了以下代码,这些代码打印出不正确的长度值,这可能会返回代码点数的值。
我怎样才能得到我期望 7 个字符的正确值?
int main() {
const char8_t* s = u8"Hello????????";
auto st = std::u8string(s);
std::cout << st.size() << std::endl;
}
【问题讨论】:
-
我认为
size()和length()对于std::u8string将返回字符串中代码点 的数量,而不是打印字符的数量。您或许可以尝试转换为std::u32string以确保所有多字节代码仅计为单个字符。 -
你打算用这个号码做什么,一旦获得?请注意,在组合使用变音符号和连字的情况下,代码点的数量可能与字素的数量(人类认为是“字符”的显示单位)不对应。
-
我想要多个显示单元。
-
@KiYugadgeter:请注意,Unicode 代码点的数量不等于字符串的“显示单位”。这需要复杂的文本布局,这是一个更加复杂的计算。
-
@AdrianMole "我认为
size()和length()对于std::u8string都会返回字符串中“代码点”的数量“-不,它们返回编码的“代码单元”的数量。 “您或许可以尝试转换为std::u32string,以确保所有多字节代码仅计为单个“字符”。” - 您所说的“字符”是事实上,“代码点”。您在视觉上看到的是代码点组,称为“字素簇”。见What's the difference between a character, a code point, a glyph and a grapheme?