std :: string :: size () странное поведение

c++ std stdstring

76 просмотра

3 ответа

Я считаю, что вывод связан с 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

Большое спасибо!

Автор: canellas Источник Размещён: 08.11.2019 11:19

Ответы (3)


4 плюса

кодируется как 2 байта, 0xC3 0xA9, в utf-8.

Автор: Peter Skarpetis Размещён: 20.08.2016 12:47

4 плюса

gcc набор символов для ввода по умолчанию - UTF-8 . Ваш редактор, вероятно, также сохранил файл как UTF-8, поэтому во входном файле .cpp строка abcdéбудет иметь 6 байтов (как уже ответил Питер, LATIN SMALL LETTER E WITH ACUTE кодируется в UTF-8 с 2 байтами). std::string::lengthвозвращает длину в байтах, т.е. 6. КЭД

Вы должны открыть свой исходный файл .cpp в шестнадцатеричном редакторе для подтверждения.

Автор: Remus Rusanu Размещён: 20.08.2016 12:57

3 плюса

Даже в C ++ 11 не std::stringимеет ничего общего с UTF-8. В описании из sizeи lengthметодов std::stringмы можем видеть:

Для std :: string элементы являются байтами (объектами типа char), которые не совпадают с символами, если используется многобайтовая кодировка, такая как UTF-8.

Таким образом, вы должны использовать стороннюю юникод-совместимую библиотеку для обработки юникодных строк.

Если вы продолжаете использовать не-юникодные строковые классы со строками юникода, вы можете столкнуться с множеством других проблем. Например, вы получите фиктивный результат при попытке сравнить одинаково выглядящий комбинированный символ и предварительно составленный символ .

Автор: Sergey Размещён: 20.08.2016 12:48
Вопросы из категории :
32x32