C ++ std :: string的长度,以字节为单位

时间:2011-10-12 16:29:31

标签: c++ string stdstring

我在查明std::string.length()的确切语义时遇到了一些麻烦。 documentation明确指出length()返回字符串中的字符数,不返回字节数。我想知道在哪些情况下这实际上有所不同。

特别是,这只与std::basic_string<>的非char实例有关,还是在存储带有多字节字符的UTF-8字符串时也会遇到麻烦?标准是否允许length()支持UTF8?

4 个答案:

答案 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::stringbasic_string的{​​{1}},而C ++标准将一个char的大小定义为一个字节。

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

编辑:标准确实说实现应提供char的定义,该定义表示一个字节中有多少位。

顺便说一句,如果你沿着一条道路走,你在乎一个字节中有多少位,你可以考虑阅读this

答案 2 :(得分:4)

std::stringstd::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()