c++ std::字符串的长度,以字节为单位
Length of a C++ std::string in bytes
我在弄清楚std::string.length()
的确切语义时遇到了一些麻烦。文档明确指出length()
返回字符串中的字符数,而不是字节数。我想知道在哪些情况下,这实际上是有区别的。
特别是,这是否仅与std::basic_string<>
的非字符实例化相关,或者我在存储具有多字节字符的UTF-8字符串时也会遇到麻烦?标准是否允许length()
识别utf8 ?
当处理std::basic_string<>
的非char
实例化时,当然,长度可能不等于字节数。这在std::wstring
:
std::wstring ws = L"hi";
cout << ws.length(); // <-- 2, not 4
但是std::string
是关于char
字符的;就std::string
而言,没有多字节字符这样的东西,无论你是否在高级别的地方塞进一个。因此,std::string.length()
始终是字符串表示的字节数。请注意,如果您将多字节的"字符"塞进std::string
中,那么您对"字符"的定义就会突然与容器和标准的定义不一致。
如果我们专门讨论std::string
,那么length()
确实返回字节数。
这是因为std::string
是char
s的basic_string
,而c++标准定义一个char
的大小恰好是一个字节。
请注意,标准没有说明一个字节有多少位,但这完全是另一回事,你可能不关心。
编辑:标准确实说实现应该为CHAR_BIT
提供一个定义,说明一个字节有多少位。
顺便说一下,如果你确实关心一个字节有多少位,你可以考虑读一读这个
一个std::string
是std::basic_string<char>
,所以s.length() * sizeof(char) = byte length
。此外,std::string
不知道UTF-8,所以即使这不是您真正想要的,您也将获得字节大小。
如果在std::string
中有UTF-8数据,则需要使用其他东西(如ICU)来获得"真实"长度。
cplusplus.com不是std::string
的"文档",它是一个充满了劣质信息的劣质网站。c++标准非常清楚地定义了它:
-
21.1(字符串。一般]¶1
这个子句描述了操作任何非数组POD(3.9)类型序列的组件。在本句中,这样的类型被称为类字符类型,类字符类型的对象被称为类字符对象或简称为字符。
-
21.4.4(字符串。能力]¶1
size_type size() const noexcept;
返回:当前字符串中类字符对象的个数。
复杂度:常数时间。size_type length() const noexcept;
返回:size()
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 常量"C"占用的空间(以字节为单位)
- C++ 中 STL 中迭代器的大小(以字节为单位)是多少
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 如何以字节为单位计算mpz_class的长度?
- 获取C++模板参数包的总大小(以字节为单位)
- C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
- visual 在指向缓冲区(字符串 " ")的空指针上使用 sizeof() C++ 以获得以字节为单位的大小?
- 如何获得以字节为单位的UTF-16LE字符串的大小
- 为什么 C/C++ "Hello World" 以千字节为单位?
- C++字符串长度(以字节为单位)
- 解码像 FAST 这样的数据协议的快速方法是什么,其中数据以字节为单位编码,并将位作为存在标志
- 解压缩加密文件(以字节为单位)
- 在 boost::multi_array 中以字节为单位表示步幅
- 省略号函数参数的大小(以字节为单位)
- C++获取EOL的大小(以字节为单位)
- 在openMPI中向进程发送数据(以字节为单位)的最佳方式
- 获取矢量的大小(以字节为单位)
- 如何将数组限制在特定的大小(以千字节为单位)