c++ std::字符串的长度,以字节为单位

Length of a C++ std::string in bytes

本文关键字:字节 为单位 std 字符串 c++      更新时间:2023-10-16

我在弄清楚std::string.length()的确切语义时遇到了一些麻烦。文档明确指出length()返回字符串中的字符数,而不是字节数。我想知道在哪些情况下,这实际上是有区别的。

特别是,这是否仅与std::basic_string<>的非字符实例化相关,或者我在存储具有多字节字符的UTF-8字符串时也会遇到麻烦?标准是否允许length()识别utf8 ?

当处理std::basic_string<>的非char实例化时,当然,长度可能不等于字节数。这在std::wstring:

中尤为明显。
std::wstring ws = L"hi";
cout << ws.length();     // <-- 2, not 4

但是std::string是关于char字符的;就std::string而言,没有多字节字符这样的东西,无论你是否在高级别的地方塞进一个。因此,std::string.length()始终是字符串表示的字节数。请注意,如果您将多字节的"字符"塞进std::string中,那么您对"字符"的定义就会突然与容器和标准的定义不一致。

如果我们专门讨论std::string,那么length() 确实返回字节数。

这是因为std::stringchar s的basic_string,而c++标准定义一个char的大小恰好是一个字节。

请注意,标准没有说明一个字节有多少位,但这完全是另一回事,你可能不关心。

编辑:标准确实说实现应该为CHAR_BIT提供一个定义,说明一个字节有多少位。

顺便说一下,如果你确实关心一个字节有多少位,你可以考虑读一读这个

一个std::stringstd::basic_string<char>,所以s.length() * sizeof(char) = byte length。此外,std::string不知道UTF-8,所以即使这不是您真正想要的,您也将获得字节大小。

如果在std::string中有UTF-8数据,则需要使用其他东西(如ICU)来获得"真实"长度。

cplusplus.com不是std::string的"文档",它是一个充满了劣质信息的劣质网站。c++标准非常清楚地定义了它:

  • 21.1(字符串。一般]¶1

    这个子句描述了操作任何非数组POD(3.9)类型序列的组件。在本句中,这样的类型被称为类字符类型,类字符类型的对象被称为类字符对象或简称为字符

  • 21.4.4(字符串。能力]¶1

    size_type size() const noexcept;
    返回:当前字符串中类字符对象的个数。
    复杂度:常数时间。

    size_type length() const noexcept;
    返回: size()