wstring c что это

std:: wstring

String class for wide characters.

This is an instantiation of the basic_string class template that uses wchar_t as the character type, with its default char_traits and allocator types (see basic_string for more info on the template).

Member types

member typedefinition
value_typewchar_t
traits_typechar_traits
allocator_typeallocator
referencewchar_t&
const_referenceconst wchar_t&
pointerwchar_t*
const_pointerconst wchar_t*
iteratora random access iterator to wchar_t (convertible to const_iterator)
const_iteratora random access iterator to const wchar_t
reverse_iteratorreverse_iterator
const_reverse_iteratorreverse_iterator
difference_typeptrdiff_t
size_typesize_t

Member functions

Note: The references to the members of its basic template (basic_string) are linked here.

(constructor) Construct basic_string object (public member function ) (destructor) String destructor (public member function ) operator= String assignment (public member function )
Iterators:
begin Return iterator to beginning (public member function ) end Return iterator to end (public member function ) rbegin Return reverse iterator to reverse beginning (public member function ) rend Return reverse iterator to reverse end (public member function ) cbegin Return const_iterator to beginning (public member function ) cend Return const_iterator to end (public member function ) crbegin Return const_reverse_iterator to reverse beginning (public member function ) crend Return const_reverse_iterator to reverse end (public member function )
Capacity:
size Return size (public member function ) length Return length of string (public member function ) max_size Return maximum size (public member function ) resize Resize string (public member function ) capacity Return size of allocated storage (public member function ) reserve Request a change in capacity (public member function ) clear Clear string (public member function ) empty Test whether string is empty (public member function ) shrink_to_fit Shrink to fit (public member function )
Element access:
operator[] Get character of string (public member function ) at Get character of string (public member function ) back Access last character (public member function ) front Access first character (public member function )
Modifiers:
operator+= Append to string (public member function ) append Append to string (public member function ) push_back Append character to string (public member function ) assign Assign content to string (public member function ) insert Insert into string (public member function ) erase Erase characters from string (public member function ) replace Replace portion of string (public member function ) swap Swap string values (public member function ) pop_back Delete last character (public member function )
String operations:
c_str Get C-string equivalent data Get string data (public member function ) get_allocator Get allocator (public member function ) copy Copy sequence of characters from string (public member function ) find Find first occurrence in string (public member function ) rfind Find last occurrence in string (public member function ) find_first_of Find character in string (public member function ) find_last_of Find character in string from the end (public member function ) find_first_not_of Find non-matching character in string (public member function ) find_last_not_of Find non-matching character in string from the end (public member function ) substr Generate substring (public member function ) compare Compare strings (public member function )

Источник

Строковые и символьные литералы (C++)

В C++ поддерживаются различные типы строк и символов, а также доступны различные способы выражения значений литералов каждого из этих типов. В исходном коде содержимое символьных и строковых литералов выражается с помощью кодировки. Универсальные имена символов и escape-символы позволяют представить любую строку, используя только основную кодировку исходного кода. Необработанные строковые литералы позволяют не использовать escape-символы и могут применяться для выражения всех типов строковых литералов. Можно также создавать std::string литералы без необходимости выполнения дополнительных действий по созданию или преобразованию.

Символьные литералы

Символьный литерал состоит из символьной константы. Он представляется символом, заключенным в одинарные кавычки. Существует пять типов символьных литералов:

Символьные литералы UTF-8 типа char ( char8_t в c++ 20), например u8’a’

Символ, используемый для символьного литерала, может быть любым символом, за исключением символов обратной косой черты ( \ ), одинарной кавычки ( ) или новой строки. Зарезервированные символы можно указывать с помощью escape-последовательности. Символы можно указывать с помощью универсальных имен символов, при условии что тип является достаточно крупным для размещения символа.

Кодирование

Символьные литералы кодируются по-разному в соответствии с их префиксом.

Символьный литерал, начинающийся с L префикса, является литералом расширенных символов. Значение литерала расширенных символов, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное числовому значению его кодировки в наборе расширенных символов выполнения, если только символьный литерал не имеет представления в наборе расширенных символов выполнения, в этом случае значение определяется реализацией. Значение литерала расширенных символов, содержащего несколько символов, escape-последовательностями или универсальных имен символов, определяется реализацией. дополнительные MSVC см. в разделе, относящемся к корпорации майкрософт ниже.

Символьный литерал, начинающийся с u8 префикса, является символьным литералом UTF-8. Значение символьного литерала UTF-8, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено в одной единице кода UTF-8 (соответствующее элементам управления C0 и основному регистру символов латиницы). Если значение не может быть представлено одной единицей кода UTF-8, программа неправильно сформирована. Символьный литерал в кодировке UTF-8, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с u префикса, является символьным литералом UTF-16. Значение символьного литерала UTF-16, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-16 (соответствующей базовой многоязыковой плоскости). Если значение не может быть представлено одной единицей кода UTF-16, программа неправильно сформирована. Символьный литерал UTF-16, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с U префикса, является символьным литералом UTF-32. Значение символьного литерала UTF-32, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению кодовой точки ISO 10646. Символьный литерал в кодировке UTF-32, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Escape-последовательности

Существует три вида escape-последовательностей: простая, восьмеричная и шестнадцатеричная. Escape-последовательностями могут быть следующие значения:

ЗначениеEscape-последовательность
новая строка\n
обратная косая черта\\
горизонтальная табуляция\t
вопросительный знак? или \?
вертикальная табуляция\v
одинарная кавычка\’
BACKSPACE\&
двойная кавычка
Возврат каретки\Cерверный
нуль-символ\0
Смена страницы
восьмеричный\OOO
оповещение (колокольчик)\a
шестнадцатеричный\ксххх

В этом примере кода показаны некоторые примеры экранированных символов с помощью обычных символьных литералов. Один и тот же синтаксис escape-последовательности допустим для других типов символьных литералов.

Обратная косая черта ( \ ) — это символ продолжения строки, когда он помещается в конец строки. Если требуется, чтобы символ обратной косой черты отображался в виде символьного литерала, необходимо ввести две обратные косые черты в строке ( \\ ). Дополнительные сведения о символе продолжения строки см. в разделе Phases of Translation.

Специально для систем Майкрософт

Восьмеричная escape-последовательность, которая содержит более трех цифр, рассматривается как восьмеричная последовательность из 3 цифр, за которой следуют последующие цифры как символы в многосимвольном литерале, что может привести к неудивительному результату. Пример:

Escape-последовательности, которые содержат невосьмеричные символы, вычисляются в виде восьмеричной последовательности вплоть до последнего восьмеричного символа, за которыми следуют оставшиеся символы в виде последующих символов в многосимвольном литерале. Предупреждение C4125 создается, если первый невосьмеричный символ является десятичной цифрой. Пример:

Восьмеричная escape-последовательность, которая имеет большее значение, чем \377 Ошибка C2022: «значение-in-Decimal«: слишком большое для символа.

Escape-последовательность, которая содержит шестнадцатеричные и нешестнадцатеричные символы, вычисляется как многосимвольный литерал, содержащий шестнадцатеричную escape-последовательность вплоть до последнего шестнадцатеричного символа, за которыми следуют нешестнадцатеричные символы. Шестнадцатеричная escape-последовательность, которая не содержит шестнадцатеричных цифр, приводит к ошибке компилятора C2153: «шестнадцатеричные литералы должны содержать по крайней мере одну шестнадцатеричную цифру».

Если в расширенном символьном литерале с префиксом L содержится последовательность из множества символов, значение берется из первого символа, а компилятор выдает предупреждение C4066. Последующие символы игнорируются, в отличие от поведения эквивалентного обычного многосимвольного литерала.

Универсальные имена символов

В символьных литералах и машинных (не являющихся необработанными) строковых литералах любой символ может быть представлен универсальным именем символа. Универсальные имена символов формируются с помощью префикса, \U за которым следует 8-значная кодовая точка Юникода или префикс, \u за которым следует 4-значная кодовая точка Юникода. Все восемь или четыре знака, соответственно, должны присутствовать для создания корректного универсального имени символа.

Суррогатные пары

В C++03 языком допускалось, чтобы универсальными именами символов представлялось лишь определенное подмножество символов. Также могли существовать универсальные имена символов, не представляющие никаких допустимых символов Юникода. Эта ошибка была исправлена в стандарте C++ 11. В C++11 в символьных и строковых литералах и идентификаторах можно использовать универсальные имена символов. Дополнительные сведения об универсальных именах символов см. в разделе Character Sets. Дополнительные сведения о Юникоде см. в статье Unicode. Дополнительные сведения о суррогатных парах см. в статье Surrogate Pairs and Supplementary Characters(Суррогатные пары и дополнительные символы).

Строковые литералы

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

Узкие строковые литералы

Строки в кодировке UTF-8

Широкие строковые литералы

char16_t и char32_t (C++11)

В c++ 11 введены переносимые char16_t (16-разрядные Юникод) и char32_t (32-разрядные Юникод) символы типа:

Необработанные строковые литералы (C++ 11)

Необработанный строковый литерал — это массив с завершающим нулем (любой символьный тип), содержащий любой графический символ, включая двойные кавычки ( « ), обратную косую черту ( \ ) или символ новой строки. Необработанные строковые литералы часто применяются в регулярных выражениях, которые используют классы символов, а также в строках HTML и XML. Примеры см. в следующей статье: Bjarne Stroustrup’s FAQ on C++11(Вопросы и ответы о C++11 от Бьерна Страуструпа).

Однако ошибку можно устранить с помощью разделителя:

Можно создать необработанный строковый литерал, содержащий символ новой строки (не экранированный символ) в источнике:

литералы std:: String (C++ 14)

s Суффикс можно также использовать для необработанных строковых литералов:

Размер строковых литералов

Для char* строк ANSI и других однобайтовых кодировок (но не UTF-8) размер строкового литерала (в байтах) — это число символов плюс 1 для завершающего нуль-символа. Для всех других типов строк размер не строго связан с числом символов. UTF-8 использует до четырех char элементов для кодирования некоторых единиц кода, а char16_t или wchar_t кодирования UTF-16 может использовать два элемента (всего четыре байта) для кодирования одной единицы кода. В примере ниже показан размер расширенного строкового литерала в байтах.

Обратите внимание, что strlen() и wcslen() не включайте размер завершающего нуль-символа, размер которого равен размеру элемента строкового типа: один байт в char* char8_t* строке или, два байта wchar_t* или char16_t* строки и четыре байта в char32_t* строках.

Максимальная длина строкового литерала составляет 65 535 байт. Это ограничение применимо как к узким, так и к расширенным строковым литералам.

Изменение строковых литералов

Поскольку строковые литералы (не включая std::string литералы) являются константами, попытка их изменить, например, str[2] = ‘A’ приводит к ошибке компилятора.

Специально для систем Майкрософт

В некоторых случаях идентичные строковые литералы могут быть объединены в пул для экономии места в исполняемом файле. При объединении строковых литералов в пулы компилятор делает так, что все ссылки на определенный строковый литерал указывают на одну и ту же область в памяти, вместо того чтобы каждая ссылка указывала на отдельный экземпляр строкового литерала. Чтобы включить объединение строк, используйте /GF параметр компилятора.

Сцепление смежных строковых литералов

Все смежные расширенные и узкие строковые литералы соединяются. Данное объявление:

идентично следующему объявлению:

и следующему объявлению:

Использование внедренных шестнадцатеричных escape-кодов для задания строковых литералов может привести к непредвиденным результатам. В следующем примере выполняется попытка создать строковый литерал, содержащий символ ASCII 5, за которым следуют символы f, i, v и e:

Фактический результат (шестнадцатеричное значение 5F) является кодом ASCII для символа подчеркивания, за которым следуют символы i, v и e. Чтобы получить правильный результат, можно использовать одну из следующих escape-последовательностей:

std::string литералы, так как они std::string являются типами, могут быть объединены с + оператором, определенным для basic_string типов. Эти литералы также можно соединить аналогично смежным строковым литералам. В обоих случаях кодировка строки и суффикс должны совпадать:

Строковые литералы с универсальными именами символов

Машинные (не являющиеся необработанными) строковые литералы могут использовать универсальные имена символов для представления любого символа, при условии что универсальные имена можно кодировать как один или несколько символов в строковом типе. Например, универсальное имя символа, представляющее расширенный символ, не может быть закодировано в виде короткой строки с помощью кодовой страницы ANSI, но может быть закодировано в виде узких строк в некоторых многобайтовых кодовых страницах или в строках UTF-8 или в расширенной строке. В C++ 11 Поддержка Юникода расширена с помощью char16_t* char32_t* строковых типов и.

Источник

Кроссплатформенная работа со строками на C++

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

Итак, первое с чем пришлось понять — что со строками в Линуксе нужно работать в кодировке UTF-8 и в типе std::string, а в Windows строки должны быть в UTF-16LE (тип std::wstring). Почему? Потому что это by design операционных систем. Хранить строки в std::wstring в Линуксе крайне накладно, поскольку один символ wchar_t занимает 4 байта (в Windows — 2 байта), а работать std::string в Windows нужно было во времена Windows 98. Для работы со строками определяем свой платформонезависимый тип:

Второе — задача преобразование текста из любой кодировки в тип mstring. Тут вариантов не так много. Первый вариант — использование std::locale и прочих соответствующих стандартных вещей. Сразу бросилось в глаза необходимость поиска для каждого charset’a соотвествующей ему локали (типа кодировке «windows-1251» соответствует локаль Russian_Russia.1251 и т.п.). В стандартной библиотеке такая таблица не нашлась (может плохо искал?), искать примочку для списка локалей не захотелось. Да и вообще, работа с локалалями в C++ вещь очень неочевидная, на мой взгляд. На форумах советовали использовать библиотеки libiconv или icu. libiconv выглядел очень легко и просто, с задачей перекодировки из любого charset’a в mstring справлялся отлично, но когда дело дошло до преобразования mstring в нижний регистр меня постиг fail. Оказалось libiconv делать это не умеет, а преобразовать строку utf8 в нижний регистр просто и красиво в Линуксе у меня не получилось. Итак, выбор пал на icu, который с честью решил все поставленные задачи (конвертация и перевод в нижний регистр). Процедура платформонезависимой перекодировки с использованием библиотеки icu выглядит примерно так:

Вопросы работы с Юникодом в Windows описывать не буду — все там достаточно хорошо документировано.

Источник

Функции

getline

Извлекает строки из входного потока, последовательно по одной строке.

Параметры

in_stream
Входной поток, из которого извлекается строка.

str
Строка, в которую считываются символы из входного потока.

delimiter
Разделитель строк.

Возвращаемое значение

Remarks

Вторая функция каждой пары является аналогом первой из них для поддержки rvalue ссылок.

Извлечение останавливается при возникновении одного из следующих условий.

Если возникает исключение in_stream и str они остаются в допустимом состоянии.

Пример

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

double Значение.

Remarks

Преобразует последовательность символов в число с плавающей запятой.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

float Значение.

Remarks

Преобразует последовательность символов в целое число.

Возвращаемое значение

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Remarks

Функция stoi преобразует последовательность символов в str в значение типа int и возвращает значение. Например, если передать последовательность символов «10», stoi возвращает целочисленное значение 10.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Длинное целое значение.

Remarks

stold

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

Возвращаемое значение

long double Значение.

Remarks

stoll

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

long long Значение.

Remarks

stoul

Преобразует последовательность символов в длинное целое без знака.

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

Длинное целое значение без знака.

Remarks

stoull

Параметры

str
Последовательность символов для преобразования.

idx
Значение индекса первого непреобразованного символа.

base
Используемое числовое основание.

Возвращаемое значение

unsigned long long Значение.

Remarks

Меняет местами массивы символов двух строк.

Параметры

left
Одна строка, элементы которой должны быть заменены элементами другой строки.

right
Другая строка, элементы которой будут заменены на элементы первой строки.

Remarks

Пример

to_string

Параметры

value
Преобразуемое значение.

Возвращаемое значение

Remarks

«%d» Если value имеет тип int

«%u» Если value имеет тип unsigned int

«%ld» Если value имеет тип long

«%lu» Если value имеет тип unsigned long

«%lld» Если value имеет тип long long

«%llu» Если value имеет тип unsigned long long

«%f» Если value имеет тип float или double

«%Lf» Если value имеет тип long double

to_wstring

Преобразует значение в расширенную строку.

Параметры

value
Преобразуемое значение.

Возвращаемое значение

Расширенная строка, представляющая значение.

Remarks

L»%d» Если value имеет тип int

L»%u» Если value имеет тип unsigned int

L»%ld» Если value имеет тип long

L»%lu» Если value имеет тип unsigned long

L»%lld» Если value имеет тип long long

L»%llu» Если value имеет тип unsigned long long

L»%f» Если value имеет тип float или double

L»%Lf» Если value имеет тип long double

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *