Подтвердить что ты не робот

Длина С++ std::string в байтах

У меня возникли проблемы с выяснением точной семантики std::string.length(). В документации явно указано, что length() возвращает количество символов в строке, а не количество байтов. Мне было интересно, в каких случаях это действительно имеет значение.

В частности, это относится только к не-w980 > экземплярам std::basic_string<> или я могу попасть в проблему при хранении строк UTF-8 с многобайтовыми символами? Предоставляет ли стандарт length() значение UTF8?

4b9b3361

Ответ 1

При использовании экземпляров char не char, конечно, длина может не равняться числу байтов. Это особенно заметно при std::wstring:

std::wstring ws = L"hi";
cout << ws.length();     // <-- 2, not 4

Но std::string составляет около char символов; нет такой вещи, как многобайтовый символ до std::string, независимо от того, переполняете ли вы один на высоком уровне или нет. Таким образом, std::string.length() всегда представляет собой количество байтов, представленных строкой. Обратите внимание, что если вы перебиваете многобайтовые "символы" в std::string, тогда ваше определение "символ" внезапно становится несовместимым с определением контейнера и стандарта.

Ответ 2

Если мы говорим конкретно о std::string, то length() делает число байтов.

Это связано с тем, что std::string является basic_string of char s, а С++ Standard определяет размер одного char как один байт.

Обратите внимание, что в стандарте не указано, сколько бит находится в байте, но эта другая история полностью, и вам, вероятно, все равно.

EDIT: в стандарте говорится, что реализация должна предоставить определение для CHAR_BIT, в котором указано, сколько бит находится в байте.

Кстати, если вы поедете по дороге, где вам все равно, сколько бит находится в байте, вы можете рассмотреть возможность чтения этого.

Ответ 3

A std::string составляет std::basic_string<char>, поэтому s.length() * sizeof(char) = byte length. Кроме того, std::string ничего не знает о UTF-8, поэтому вы получите размер байта, даже если это не то, что вам нужно.

Если у вас есть данные UTF-8 в std::string, вам нужно будет использовать что-то еще, например ICU, чтобы получить "реальная" длина.

Ответ 4

cplusplus.com не является "документацией" для std::string, это сайт низкого качества, заполненный информацией низкого качества. Стандарт С++ определяет это очень четко:

  • 21.1 [strings.general] ¶1

    В этом разделе описаны компоненты для управления последовательностями любого типа массива POD (3.9). В этом разделе такие типы называются типами char -like, а объекты типов типа char называются char -подобными объектами или просто символами.

  • 21.4.4 [string.capacity] ¶1

    size_type size() const noexcept;
    Возвращает: количество объектов char, находящихся в данный момент в строке. Сложность: постоянное время.

    size_type length() const noexcept;
    Возвращает: size()