我相信输出与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字符串,你可能会面临很多其他问题。例如,当您尝试比较外观相同的组合字符和预组合字符时,您将得到一个虚假的结果。