Wstring c что это
Перейти к содержимому

Wstring c что это

  • автор:

Определения типов

Тип, описывающий специализацию шаблона 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 MSD

    std::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 MSD

    wstring 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";

    >и читать в неё прямо из файла ?

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

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