Длина C ++ std :: string в байтах - PullRequest
13 голосов
/ 12 октября 2011

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

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

Ответы [ 4 ]

24 голосов
/ 12 октября 2011

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

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

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

9 голосов
/ 12 октября 2011

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

Это потому, что std::string - это basic_string из char с, а стандарт C ++ определяет размер одного char как ровно один байт.

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

РЕДАКТИРОВАТЬ: Стандарт говорит, что реализация должна предоставить определение для CHAR_BIT, которое говорит, сколько битов в байте.

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

4 голосов
/ 12 октября 2011

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

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

0 голосов
/ 28 мая 2013

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

  • 21,1 [strings.general] ¶1

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

  • 21.4.4 [string.capacity] ¶1

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

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

...