gpt4 book ai didi

c++ - std::u16string、std::u32string、std::string、length()、size()、码点和字符

转载 作者:IT老高 更新时间:2023-10-28 23:14:45 39 4
gpt4 key购买 nike

我很高兴在 C++11 中看到 std::u16stringstd::u32string,但我想知道为什么没有 std::u8string 来处理 UTF-8 的情况。我的印象是 std::string 是为 UTF-8 设计的,但它似乎做得不太好。我的意思是, std::string.length() 是否仍然返回字符串缓冲区的大小而不是字符串中的字符数?

那么,如何为新的 C++11 类定义标准字符串的 length() 方法?它们是否返回字符串缓冲区的大小、代码点数或字符数(假设代理对是 2 个代码点,但只有一个字符。如果我错了,请纠正我)?

那么 size();它不等于 length() 吗?见 http://en.cppreference.com/w/cpp/string/basic_string/length让我困惑的根源。

所以,我想,我的基本问题是如何使用 std::stringstd::u16stringstd::u32string 并正确区分缓冲区大小、代码点数和字符数?如果您使用标准迭代器,您是在对字节、代码点还是字符进行迭代?

最佳答案

u16stringu32string 不是“新的 C++11 类”。它们只是 char16_tcha32_t 类型的 std::basic_string 的 typedef。

对于任何 basic_string

length 始终等于 size。它是字符串中 T 的数量,其中 Tbasic_string 的模板类型。

basic_string 不以任何方式、形状或形式识别 Unicode。它没有代码点、字素、Unicode 字符、Unicode 规范化或任何类似的概念。它只是 T 的有序序列。 u16stringu32string 唯一能识别 Unicode 的是它们使用 u""U"返回的类型" 文字。因此,它们可以存储 Unicode 编码的字符串,但它们不做任何需要知道所述编码的事情。

迭代器迭代 T 的元素,而不是“字节、代码点或字符”。如果 Tchar16_t,那么它将遍历 char16_ts。如果字符串是 UTF-16 编码的,那么它正在迭代 UTF-16 代码单元,而不是 Unicode 代码点或字节。

关于c++ - std::u16string、std::u32string、std::string、length()、size()、码点和字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251340/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com