Std::string::size()奇怪的行为
std::string::size() strange behaviour
我相信输出与UTF有关,但我不知道如何。有人能解释一下吗?
#include <iostream>
#include <cstdint>
#include <iomanip>
#include <string>
int main()
{
std::cout << "sizeof(char) = " << sizeof(char) << std::endl;
std::cout << "sizeof(std::string::value_type) = " << sizeof(std::string::value_type) << std::endl;
std::string _s1 ("abcde");
std::cout << "s1 = " << _s1 << ", _s1.size() = " << _s1.size() << std::endl;
std::string _s2 ("abcdé");
std::cout << "s2 = " << _s2 << ", _s2.size() = " << _s2.size() << std::endl;
return 0;
}
输出为:
sizeof(char) = 1
sizeof(std::string::value_type) = 1
s1 = abcde, _s1.size() = 5
s2 = abcdé, _s2.size() = 6
g++ --version
打印g++ (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
QTCreator
编译如下:
g++ -c -m32 -pipe -g -std=c++0x -Wall -W -fPIC -I../strsize -I. -I../../Qt/5.5/gcc/mkspecs/linux-g++-32 -o main.o ../strsize/main.cpp
g++ -m32 -Wl,-rpath,/home/rodrigo/Qt/5.5/gcc -o strsize main.o
非常感谢!
gcc
默认输入字符集为UTF-8。您的编辑器也可能将文件保存为UTF-8,因此在您的输入.cpp文件中,字符串abcdé
将有6个字节(正如Peter已经回答的那样,拉丁小写字母E WITH ACUTE以2个字节的UTF-8编码)。std::string::length
返回以字节为单位的长度。6. QED
您应该在十六进制编辑器中打开源代码.cpp文件以确认
即使在c++ 11中,std::string
也与UTF-8无关。在std::string
的size
和length
方法的描述中我们可以看到:
对于std::string,元素是字节(char类型的对象),如果使用多字节编码(如UTF-8),则与字符不同。
因此,你应该使用一些第三方的unicode兼容库来处理unicode字符串。
如果你继续使用非unicode字符串类和unicode字符串,你可能会面临很多其他问题。例如,当您尝试比较外观相同的组合字符和预组合字符时,您将得到一个虚假的结果。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- std::string.size() 未知行为
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 与 string.size() 比较时 int 的符号性显示警告
- 为什么 0 < string.size() - N 为真,而 string.size() = 0
- 在 c++ 中,std::string::size() 不计算修改后的字符串长度
- 为什么 --string::end() 可以编译,而 --string.size() 不能编译?
- String.length() 或 String.size() 返回带有 "x" (\x5) 的数字
- C++ std::string length() 或 size() 不适用于方法参数
- 除了string.size之外,该如何
- std::string的size()和length()有什么不同吗
- 获取指向成员std::string::size的指针无法与libc++链接,但可以与libstdc++一起使用
- std::string 实现是否符合其中 's.c_str() + s.size()' 不一定与 '&s[s.size()]' 相同?
- std::string::size() 是如何实现的
- 哪个更快,string.empty()还是string.size()==0
- c++中string.size()的类型是什么?
- Std::string::size()奇怪的行为
- 在使用string.size()时获得无限循环
- 字符串回文在String.size()上给出错误答案,但在String.seize()-1上给出正确答案
- std::string::length() vs. std::string::size()