std :: wstring长度

时间:2010-11-15 11:12:28

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

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

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:1)

首先,std :: wstring是std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >的实例化。

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

length()size()通常会返回字符串中的“字符”数(不论宽度),不包括 null,此处为长度&amp; size为2. capacity()返回在字符串重新分配之前通常可用的内存量(读取:多少字符,因为这是多字节)。