Length of a C++ std::string in bytes
我在弄清楚std::string.length()的确切语义时遇到了一些麻烦。
文档明确指出length()返回字符串中的字符数而不是字节数。 我想知道在哪些情况下这实际上有所作为。
特别是,这只与std::basic_string<>的非char实例有关,还是在存储带有多字节字符的UTF-8字符串时也会遇到麻烦? 标准是否允许length()支持UTF8?
-
有UTS的wstring,并且它使得长度返回字符数的感觉,因为字符大小可能会有所不同。
-
@AndersK。:不,wchar_t具有与任何其他类型一样的固定大小。 它不能神奇地变化。
-
还要查看关于std::string vs. std::wstring的这个可爱线程以及关于Unicode的一些内容:stackoverflow.com/questions/402283/stdwstring-vs-stdstring
-
@AndersK。:wstring与UTF无关。 也许你在考虑u16string或u32string?
在处理std::basic_string<>的非char实例化时,确定,长度可能不等于字节数。对于std::wstring,这一点尤其明显:
1 2
| std::wstring ws = L"hi";
cout << ws.length(); // <-- 2, not 4 |
但std::string约为char个字符;就std::string而言,没有多字节字符这样的东西,无论你是否在高级别中填充了一个字符。因此,std::string.length()始终是字符串表示的字节数。请注意,如果您将多字节"字符"填入std::string,那么您对"字符"的定义会突然变得与容器和标准的定义不一致。
-
这很有道理。我只是对这里文档中的措辞感到困惑。谢谢你清理。
-
@ComicSansMS:没问题:)
-
但是std::string大约是char个字符,因此C ++中"character"的定义是"某个字符串类型的元素",而不是"人类看到,编码的是什么"或"以某种方式编码的unicode代码点"。这听起来很可信,但任何人都可以引用这个章节和经文吗?
-
@AdrianRatnapala:标准表示它并不关心编码,更不用说它没有说它的确如此。仍然,2.31可能是有意义的 - 它定义了"基本字符集"。并且2.33说:The execution character set and the execution wide-character set are implementation-defined supersets of the basic execution character set and the basic execution wide-character set, respectively. The values of the members of the execution character sets and the sets of additional members are locale-specific.
-
嗯,我想这就是我要求章节和经文。
-
@AdrianRatnapala:是的,在要求章节和经文时,你会得到章节和经文。还有什么我可以帮你的吗? :)
如果我们专门讨论std::string,那么length()会返回字节数。
这是因为std::string是char的basic_string,而C ++标准将一个char的大小定义为恰好一个字节。
请注意,标准没有说明一个字节中有多少位,但这完全是另一个故事,你可能并不在乎。
编辑:标准确实说实现应提供CHAR_BIT的定义,该定义表示一个字节中有多少位。
顺便说一句,如果你沿着一条道路走,你在乎一个字节中有多少位,你可以考虑阅读它。
-
实际上,"字节"不一定与"八位字节"同义。
-
+1对于最后一句,很好。
-
标准确实定义了CHAR_BIT,即一个字节中的位数。
-
@Mike:是的,但标准并没有说出那些定义的内容。当我说"没有说一个字节中有多少位"时,我的意思是精确的,无意义的。但是Ill通过编辑澄清了我的帖子,感谢你指出这一点。
A std::string是std::basic_string,所以s.length() * sizeof(char) = byte length。此外,std::string对UTF-8一无所知,所以即使那不是你真正想要的东西,你也会得到字节大小。
如果您在std::string中有UTF-8数据,则需要使用其他内容(如ICU)来获得"实际"长度。
cplusplus.com不是std::string的"文档",它是一个质量低劣的信息质量低劣的网站。 C ++标准非常清楚地定义它: