Std::string::size()奇怪的行为

std::string::size() strange behaviour

本文关键字:string size Std      更新时间:2023-10-16

我相信输出与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

非常感谢!

被编码为2字节,0xC3 0xA9, utf-8。

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::stringsizelength方法的描述中我们可以看到:

对于std::string,元素是字节(char类型的对象),如果使用多字节编码(如UTF-8),则与字符不同。

因此,你应该使用一些第三方的unicode兼容库来处理unicode字符串。

如果你继续使用非unicode字符串类和unicode字符串,你可能会面临很多其他问题。例如,当您尝试比较外观相同的组合字符和预组合字符时,您将得到一个虚假的结果。