std::wstring的长度

11

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个回答

16

std::wstring::size()函数返回字符串中宽字符元素的数量,而不是字符的数量(正如你所正确发现的那样)。

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


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

尽管大部分真正的工作是由char_traits完成的,而且你可以编写自己的char_traits,但主要是为了使C运行时库能够使用不同大小的字符。

解析Element*指针的方法是一直解析,直到达到char_traits指定的终止符为止。

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

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


为什么这个答案被标记为不好?我提供了关于wstring是什么以及它如何从指针构建的有用信息。 - CashCow
我个人认为这是一个很好的答案,特别是你对char_traits终止字符的使用进行了解释。 - user140327

0

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


size_type string::capacity() const返回字符串在不重新分配内存的情况下可以容纳的字符数。 - Sanja Melnichuk

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接