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

时间:2016-08-20 12:40:32

标签: c++ std stdstring

我相信输出与UTF有关,但我不知道如何。 有人请解释一下吗?

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 编译如下:

 using (var webClient = new System.Net.WebClient())
{
    var json = webClient.DownloadString("http://localhost:8080/projecten/api/leerlingen");

}

非常感谢!

3 个答案:

答案 0 :(得分:4)

é在utf-8中编码为2个字节,0xC3 0xA9。

答案 1 :(得分:4)

abcdé default input character set is UTF-8。您的编辑器也可能将文件保存为UTF-8,因此在输入.cpp文件中,字符串std::string::length将有6个字节(正如Peter已经回答的那样,LATIN SMALL LETTER E WITH ACUTE以UTF-8编码,其中2字节)。 module.exports = { "name": "foo", "key": true, }; 以字节为单位返回长度,即。 6. QED

您应该在十六进制编辑器中打开源.cpp文件进行确认。

答案 2 :(得分:3)

即使在C ++ 11中,std::string与UTF-8无关。在size的{​​{1}}和length方法的std::string我们可以看到:

  

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

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

如果继续使用带有unicode字符串的非unicode字符串类,则可能会遇到很多其他问题。例如,在尝试比较同样的descriptioncombining character时,您会得到一个虚假的结果。