我在查明std::string.length()
的确切语义时遇到了一些麻烦。
documentation明确指出length()
返回字符串中的字符数,不返回字节数。我想知道在哪些情况下这实际上有所不同。
特别是,这只与std::basic_string<>
的非char实例有关,还是在存储带有多字节字符的UTF-8字符串时也会遇到麻烦?标准是否允许length()
支持UTF8?
答案 0 :(得分:23)
在处理char
的非std::basic_string<>
实例化时,确定,长度可能不等于字节数。 std::wstring
:
std::wstring ws = L"hi";
cout << ws.length(); // <-- 2, not 4
但std::string
约为char
个字符;就std::string
而言,不存在多字节字符这样的事情,无论你是否在高级别中填充了一个字符。因此,std::string.length()
始终是字符串表示的字节数。请注意,如果您将多字节“字符”填入std::string
,那么您对“字符”的定义突然变得与容器和标准的定义不一致。
答案 1 :(得分:9)
如果我们专门讨论std::string
,那么length()
会返回字节数。
这是因为std::string
是basic_string
的{{1}},而C ++标准将一个char
的大小定义为一个字节。
请注意,标准没有说明一个字节中有多少位,但这完全是另一个故事,你可能并不关心。
编辑:标准确实说实现应提供char
的定义,该定义表示一个字节中有多少位。
顺便说一句,如果你沿着一条道路走,你在乎一个字节中有多少位,你可以考虑阅读this。
答案 2 :(得分:4)
std::string
为std::basic_string<char>
,因此s.length() * sizeof(char) = byte length
。此外,std::string
对UTF-8一无所知,所以即使不是你真正想要的东西,你也会得到字节大小。
如果您在std::string
中包含UTF-8数据,则需要使用其他内容(例如ICU)来获得“实际”长度。
答案 3 :(得分:0)
cplusplus.com不是std::string
的“文档”,它是一个质量差的网站,信息质量差。 C ++标准非常清楚地定义了它:
21.1 [strings.general]¶1
本条款描述了用于操纵任何非阵列POD(3.9)类型的序列的组件。在本条款中,此类型称为类似char的类型,类似char的类型的对象称为类似char的对象或简称为字符。
21.4.4 [string.capacity]¶1
size_type size() const noexcept;
返回:当前字符串中类似char的对象数的计数 复杂性:恒定时间。
size_type length() const noexcept;
返回:size()