Определения типов
Тип, описывающий специализацию шаблона basic_string класса с элементами типа char .
Другие типдефы, которые специализируются basic_string , включают wstring , u16string и u32string .
typedef basic_string, allocator> string;
Замечания
Следующие объявления являются равнозначными:
string str(""); basic_string str("");
Список строковых конструкторов см. в разделе basic_string::basic_string .
u16string
Тип, описывающий специализацию шаблона basic_string класса с элементами типа char16_t .
Другие типдефы, которые специализируются basic_string , включают wstring , string и u32string .
typedef basic_string, allocator> u16string;
Замечания
Список строковых конструкторов см. в разделе basic_string::basic_string .
u32string
Тип, описывающий специализацию шаблона basic_string класса с элементами типа char32_t .
Другие типдефы, которые специализируются basic_string , включают string , u16string и wstring .
typedef basic_string, allocator> u32string;
Замечания
Список строковых конструкторов см. в разделе basic_string::basic_string .
wstring
Тип, описывающий специализацию шаблона basic_string класса с элементами типа wchar_t .
Другие типдефы, которые специализируются basic_string , включают string , u16string и u32string .
typedef basic_string, allocator> wstring;
Замечания
Следующие объявления являются равнозначными:
wstring wstr(L""); basic_string wstr(L"");
Список строковых конструкторов см. в разделе basic_string::basic_string .
Размер wchar_t определяется при реализации. Если код исходит из определенного размера wchar_t , проверьте реализацию вашей платформы (например, с помощью sizeof(wchar_t) ). Если вам нужен строковый тип символа с шириной, которая гарантированно останется одинаковой на всех платформах, используйте string u16string или u32string .
См. также
Обратная связь
Были ли сведения на этой странице полезными?
Wstring c что это
Для поддержки строк с символами кодировок Unicode в С++ в модуле также есть еще ряд дополнительных типов строк.
- std::wstring содержит строку символов типа wchar_t
- std::u8string содержит строку символов типа char8_t (добавлена в C++20)
- std::u16string содержит строку символов типа char16_t
- std::u32string содержит строку символов типа char32_t
Например, определим переменную типа std::wstring
std::wstring text;
Ее также можно инициализировать конкретной строкой. При присвоении переменной wstring перед строкой указывается префикс L . Для определения строк других типов также применяются определенные суффиксы: u8 для u8string, u для u16string и U для u32string. Например, определим переменные этих типов
std::wstring text ; std::u8string text8; std::u16string text16 ; std::u32string text32 ;
Для вывода строки типа std::wstring применяется поток std::wcout
#include #include int main() < std::wstring text ; std::wcout
Для вывода строк остальных типов в С++ пока не определено своих типов потоков.
В остальном работа со строками этих типов аналогична работе с типом string , они могут использовать те же функции, что и тип string .
Однако стоит учитывать, что поскольку wstring использует тип символов wchar_t , то кодировка символов таких строк зависит от компилятом. На Windows обычно применяется UTF-16, соответственно строка будет состоять из 2-байтовых символов UTF-16. Но в большинстве других систем применяются 4-байтные символы UTF-32 wchar_t . На этом фоне типы u8string , u16string и u32string выглядят более предпочтительно, однако на данный момент в C++ имеется довольно ограниченная поддержка по работе с символами Unicode.
- Глава 1. Введение в С++
- Язык программирования С++
- Первая программа на Windows. Компилятор g++
- Первая программа на Windows. Компилятор Clang
- Первая программа на Windows. Компилятор Microsoft Visual C++
- Первая программа на Linux. Компилятор g++
- Первая программа на MacOS. Компилятор Clang
- Настройка параметров компиляции
- Локализация и кириллица в консоли
- Структура программы
- Переменные
- Типы данных
- Константы
- Ввод и вывод в консоли
- using. Подключение пространств имен и определение псевдонимов
- Арифметические операции
- Статическая типизация и преобразования типов
- Поразрядные операции
- Операции присваивания
- Условные выражения
- Конструкция if-else и тернарный оператор
- Конструкция switch-case
- Циклы
- Ссылки
- Массивы
- Многомерные массивы
- Массивы символов
- Введение в строки
- Что такое указатели
- Операции с указателями
- Арифметика указателей
- Константы и указатели
- Указатели и массивы
- Определение и объявление функций
- Область видимости объектов
- Параметры функции
- Передача аргументов по значению и по ссылке
- Константные параметры
- Оператор return и возвращение результата
- Указатели в параметрах функции
- Массивы в параметрах функции
- Параметры функции main
- Возвращение указателей и ссылок
- Перегрузка функций
- Рекурсивные функции
- Рекурсия на примере быстрой сортировки
- Указатели на функции
- Указатели на функции как параметры
- Тип функции
- Указатель на функцию как возвращаемое значение
- Разделение программы на файлы
- Внешние объекты
- Динамические объекты
- Динамические массивы
- unique_ptr
- shared_ptr
- Определение классов
- Конструкторы и инициализация объектов
- Управление доступом. Инкапсуляция
- Объявление и определение функций класса
- Конструктор копирования
- Константные объекты и функции
- Ключевое слово this
- Дружественные функции и классы
- Статические члены класса
- Деструктор
- Структуры
- Перечисления
- Наследование
- Управление доступом в базовых и производных классах
- Скрытие функционала базового класса
- Множественное наследование
- Виртуальные функции и их переопределение
- Преобразование типов
- Динамическое преобразование
- Особенности динамического связывания
- Чистые виртуальные функции и абстрактные классы
- Перегрузка операторов
- Операторы преобразования типов
- Оператор индексирования
- Переопределение оператора присваивания
- Пространства имен
- Вложенные классы
- Обработка исключений
- Вложенные try-catch
- Создание своих типов исключений
- Тип exception
- Типы исключений
- Шаблоны функций
- Шаблон класса
- Специализация шаблона класса
- Наследование и шаблоны классов
- Типы контейнеров
- Вектор
- Итераторы
- Операции с векторами
- Array
- List
- Forward_list
- Deque
- Стек std::stack
- Очередь std::queue
- Очередь приоритетов std::priority_queue
- Множества
- Словарь std::map
- Span
- Определение строк
- Строки с поддержкой Unicode
- Преобразование типов и строки
- Сравнение строк
- Получение подстроки и проверка начала и конца строки
- Поиск подстроки
- Изменение строки
- Операции с символами
- Программа подсчета слов
- Тип std:string_view
- rvalue
- Конструктор перемещения
- Оператор присваивания с перемещением
- Роль noexcept при перемещении
- Объекты функций
- Лямбда-выражения
- Захват внешних значений в лямбда-выражениях
- Шаблон std::function<>
- Минимальный и максимальный элементы
- Поиск элементов
- Копирование элементов
- Удаление элементов и идиома Remove-Erase Idiom
- Сортировка
- Представления. Фильтрация
- Проекция данных
- Пропуск элементов. drop_view и drop_while_view
- Извлечение диапазона элементов. take_view и take_while_view
- Цепочки представлений
- Оператор requires
- Концепты
- Выражение requires
- Ограничения типа для auto
- Базовые типы для работы с потоками
- Файловые потоки. Открытие и закрытие
- Чтение и запись текстовых файлов
- Переопределение операторов ввода и вывода
- Математические константы и операции
- Форматирование строк и функция format
- std::optional
- Управление ресурсами. Идиома RAII
- Идиома копирования и замены
- Идиома Move-and-Swap
- Первая программа в Visual Studio
- Первая программа в Qt Creator
std::string vs std::wstring в русскоязычном приложении
Поскольку в свое время плавно переехал с чистого C на С++/Qt, то все проблемы unicode остались за кадром, скрытые внутри QString . Теперь при переходе на std возникает вопрос в чем хранить строковые переменные и какие потенциальные проблемы может это вызвать. Поиск не дал однозначного ответа, т.к. советуют использовать wstring , если есть данные unicode. Но при этом я сейчас спокойно выкачиваю информацию из базы данных PostgreSql, где все в юникоде, в std::string и никаких проблем с кодировкой нет. Задайте пожалуйста правильное направление, чтобы потом не было мучительно больно :)
Отслеживать
user361068
задан 19 ноя 2017 в 11:57
161 8 8 бронзовых знаковstd::string с его однобайтовой кодировкой может хранить символы максимум двух языков (английского и локалеспецифичного), ну и некоторые символы. Плюс вам иногда придётся хранить идентификатор используемой кодовой страницы. std::wstring же при использовании в нём UTF-16 или UCS-2 позволяет использовать единый Юникод, поддерживающий все письменности мира и огромную кучу знаков сразу (одновременно). Хотя, в std::string можно использовать и UTF-8, но стандартной библиотекой такой сценарий не поддерживается.
19 ноя 2017 в 12:26
19 ноя 2017 в 12:26@nrw: Ну, тогда попробуйте попрофилировать std::string с utf8-операциями, и std::wstring с ucs-2 на тех операциях, которые нужны вашей программе (это важно). Учтите, что в utf-8 операция «найти i-ый символ» требует пробега по всей строке.
19 ноя 2017 в 14:40
@VladD "достаточно UCS-2" — вот благодаря таким людям у нас всё ещё полно сломанных приложений, хотя это rocket science чтобы не рубить символ. На дворе не 90-ые годы прошлого века, ожидать что курсор со смайликом будет работать — это не слишком много требовать.
19 ноя 2017 в 15:03
@VladD вы начали с того, что в utf-8 отрезать первый символ не просто. Я ответил, что и в utf-16 это также не просто. Вы ответили что "достаточно UCS-2" и позже как всё тяжело "в рамках реальности". Я повторяю, что мы можем лучше. Это не теория. К примеру, я смотрю что Chromium умеет даже с такими символами работать как комбинация U+1f1f7 U+1f1fa Внутреннее представление строк не так важно, если вы понимаете что делаете и не пытаетесь с помощью наивной индексации символы резать.
[c++> std::wstring
Нужен номарльный мануал по сабжу на русском/английском. Гугл находит только пример преобразования string/wstring.
Заранее всем спасибо.
iero
13.04.09 23:09:34 MSDstd::wstring это, вообще-то, std::basic_string. любой мануал по std::string будет ничуть не менее применим и к std::wstring
jtootf ★★★★★
( 13.04.09 23:35:50 MSD )
Ответ на: комментарий от jtootf 13.04.09 23:35:50 MSDа есть ли культурные способы инициализировать wstring в виде:
и читать в неё прямо из файла ?
iero
( 14.04.09 00:02:57 MSD ) автор топика
Ответ на: комментарий от iero 14.04.09 00:02:57 MSDwstring ws = new wstring("qwerty"); не прокатит?
mono ★★★★★
( 14.04.09 00:16:18 MSD )
Ответ на: комментарий от mono 14.04.09 00:16:18 MSD>wstring ws = new wstring("qwerty");
ну тогда уж либо со здездочкой перед ws, либо без new =)
yoghurt ★★★★★
( 14.04.09 00:37:12 MSD )Josuttis - C++ Standard Library / Джосьютис - Стандартная библиотека С++
стр. 454, глава "Строки"
yoghurt ★★★★★
( 14.04.09 00:38:33 MSD )
Ответ на: комментарий от iero 14.04.09 00:02:57 MSD>а есть ли культурные способы инициализировать wstring в виде:
>wstring ws="qwerty";
>и читать в неё прямо из файла ?