代码之家  ›  专栏  ›  技术社区  ›  Julian Popov

std::wstring长度

  •  6
  • Julian Popov  · 技术社区  · 14 年前

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

    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
    
    4 回复  |  直到 11 年前
        1
  •  12
  •   Frerich Raabe    14 年前

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

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

        2
  •  2
  •   Rob Kennedy    14 年前

    首先std::wstring是 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > .

    尽管大多数实际工作都是由char_traits完成的,而且可以自己编写,但这主要是为了使用具有不同字符大小的C运行库。

    在元素*的指针中进行解析的方法是,直到到达作为终结符的char_traits所指示的字符为止。

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

    char_traits中没有将多元素字符解码为一个字符的魔力,也不应该尝试这样实现它。

        3
  •  0
  •   Sanja Melnichuk    14 年前

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

        4
  •  0
  •   Nim    14 年前

    length() size() 通常返回字符串中的“字符数”(与宽度无关) 排除 这个 null ,这里的长度和大小是2。 capacity() 返回字符串重新分配之前通常可用的内存量(读取:有多少个字符,因为这是多字节的)。