【问题标题】:std::wstring lengthstd::wstring 长度
【发布时间】:2010-11-15 11:12:28
【问题描述】:

std::wstring.length() 函数的结果是 wchar_t(s) 中的长度还是符号中的长度?为什么?

TCHAR r2[3];
r2[0] = 0xD834;  // D834, DD1E - musical G clef
r2[1] = 0xDD1E;  //
r2[2] = 0x0000;  // '/0'

std::wstring r = r2;

std::cout << "capacity: " << r.capacity() << std::endl;
std::cout << "length: "   << r.length()   << std::endl;
std::cout << "size: "     << r.size()     << std::endl;
std::cout << "max_size: " << r.max_size() << std::endl;

Output>

capacity: 351
length: 2
size: 2
max_size: 2147483646

【问题讨论】:

    标签: c++ string encoding std utf-16


    【解决方案1】:

    std::wstring::size() 返回字符串中宽字符元素的数量。这与字符数不同(正如您正确注意到的那样)。

    不幸的是,std::basic_string 模板(以及它的实例化,例如std::stringstd::wstring)与编码无关。从这个意义上说,它实际上只是一个字节串的模板,而不是一个字符串。

    【讨论】:

      【解决方案2】:

      首先 std::wstring 是std::basic_string&lt;wchar_t, std::char_traits&lt;wchar_t&gt;, std::allocator&lt;wchar_t&gt; &gt; 的实例化。

      虽然大部分实际工作是由 char_traits 完成的,并且可以自己编写,但这主要是为了能够使用具有不同字符大小的 C 运行时库。

      解析Element*指针的方法是直到到达char_traits所指示的作为终止符的字符。

      但是,您可以使用指针和长度进行构造,在这种情况下,它将读取它告诉您的字符数,其中包括任何空字节。您可能在 basic_string 中嵌入了空字节,如果您调用 length() 或 size() 是同一事物的别名,它会告诉您它包含多少个字符。

      char_traits 没有将多元素字符解码为一个的魔法,您也不应该尝试以这种方式实现它。

      【讨论】:

      • 为什么这个答案被标记了?我提供了关于 wstring 到底是什么以及它是如何从指针构造的有用信息。
      • 我认为这是一个很好的答案,特别是您对 char_traits 终止符的使用的解释。
      【解决方案3】:

      size 方法返回字符串中当前元素的数量。它与 wstring::length 相同 人们通常谈论一个单词、句子或段落的长度,而不是它的大小

      【讨论】:

      • size_type string::capacity() const 返回字符串在不重新分配的情况下可以容纳的字符数。
      【解决方案4】:

      length()size() 通常返回字符串中的“字符”数(不考虑宽度)不包括 null,这里的长度和大小为 2。capacity()返回在重新分配字符串之前通常可用多少内存(读取:多少字符,因为这是多字节)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多