Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/75: Рейтинг темы: голосов - 75, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 30.01.2020
Сообщений: 4

Перевод string в wstring

17.02.2020, 19:37. Показов 14729. Ответов 9
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
В проекте требуется перевод строк из string в wstring, я использую такую вот конструкцию, но данная конструкция не позволяет переводить символы кириллицы так как кодировки разные, кто то знает другую конструкцию или как допилить эту

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include<string>
#include <codecvt>
#include <windows.h>
 
using namespace std;
using convert_t = std::codecvt_utf8<wchar_t>;
wstring_convert<convert_t, wchar_t> strconverter;
 
string to_string(std::wstring wstr)                                 //Конструкция перевода в String из WString
{
    return strconverter.to_bytes(wstr);
}
 
wstring to_wstring(std::string str)                                 //Конструкция перевода в WString из String
{
    return strconverter.from_bytes(str);
}
 
 
int main()
{
    setlocale(LC_ALL, "");                                 //Локализация Русского языка
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    string Name = "АБВвба";
    wstring wsName = to_wstring(Name);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2020, 19:37
Ответы с готовыми решениями:

Перевод из string в wstring. Неправильная кодировка
Здорова господа! Перевожу строку из string в wstring, в строке русские символы и они выводятся в консоли не крякозябрами а просто...

Из string в wstring
Как можно получить wstring-строку из string-строки? (символы в строке латинские, поэтому проблем вроде бы возникать не должно)

Сконвертировать string в wstring
Люди подскажите пожалуйста как правильно сконвертировать string с кириллицей в wstring т.е std::string str = &quot;Привет мир&quot;;...

9
 Аватар для Recrut_rf
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,440
17.02.2020, 20:57
VrameeV, самый банальный - пройтись циклом по string и присвоить string[i] соответствующему wstring[i]

Добавлено через 2 минуты
Можно попробовать создать объект wstring, передавая ему в конструктор строку string
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.02.2020, 21:00
Цитата Сообщение от VrameeV Посмотреть сообщение
std::codecvt_utf8
Для начала попробуйте u8"АБВвба". Хотя, наиболее правильное решение - просто не делать винегрет из кодировок.
Цитата Сообщение от Recrut_rf Посмотреть сообщение
VrameeV, самый банальный - пройтись циклом по string и присвоить string[i] соответствующему wstring[i]
В wstring UTF16/UTF32. В string - восьмибитовая кодировка, причем хрен знает какая. При тупом "присвоить" фигня получится.
0
 Аватар для Recrut_rf
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,440
17.02.2020, 21:37
VrameeV, мой первый вариант неверный - извиняюсь...

Сейчас через пару минут всё будет

Добавлено через 3 минуты
VrameeV, мой шедевр

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <locale>
#include <string>
#include <vector>
#include <Windows.h>
 
 
// convert string to wstring
std::wstring to_wstring(const std::string& str,
    const std::locale& loc = std::locale())
{
    std::vector<wchar_t> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).widen(str.data(),
        str.data() + str.size(),
        buf.data());
    return std::wstring(buf.data(), buf.size());
}
 
// convert wstring to string with '?' as default character
std::string to_string(const std::wstring& str,
    const std::locale& loc = std::locale())
{
    std::vector<char> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).narrow(str.data(),
        str.data() + str.size(),
        '?', buf.data());
    return std::string(buf.data(), buf.size());
}
 
 
int main()
{
    SetConsoleCP(1251);              // если есть это
    //setlocale(LC_ALL, "");         // то это не надо
    SetConsoleOutputCP(1251);
 
    std::string s = "АБВвба\n";
    std::wstring ws = to_wstring(s);
    std::wcout << ws;
    std::cout << to_string(ws);
}
Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
При тупом "присвоить" фигня получится.
Полнейшая - хотя без проблем компилируется, я уверовал в конструктор копирования и оператор присваивания, но это не работает...

Добавлено через 12 минут
Как я и думал - весь косяк в том, что внутри std::string лежит char, а внутри std::wstring - wchar_t

Для интересующихся - это легко посмотреть в собственной среде разработки
Этот кусок, к примеру, из моей Visual Studio 15:
C++
1
2
3
4
typedef basic_string<char, char_traits<char>, allocator<char> >
    string;
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >
    wstring;
Соответственно эта строка покажет нам
C++
1
std::cout << sizeof(wchar_t) << " " << sizeof(char) << std::endl;
2 и 1 байт соответственно.

Поэтому просто скопировать символы (как я хотел в своём первом посту) из одно "байтного стринга" в "двух байтный" не получится
0
поисковый робот
 Аватар для cpp_user
30 / 23 / 9
Регистрация: 04.02.2020
Сообщений: 96
17.02.2020, 22:13
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Соответственно эта строка покажет нам

2 и 1 байт соответственно.
размер wchar_t от системы зависит

Linux и OS X - 4 байта
Windows - 2 байта
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.02.2020, 08:03
Цитата Сообщение от Recrut_rf Посмотреть сообщение
std::vector<wchar_t> buf(str.size());
В Windows используется UTF-16, а она мультибайтная. Символ может кодироваться как одной, так и двумя кодовыми единицами (code unit), так что такой метод определения конечного размера не верен. Во второй функции ситуация аналогичная.
0
0 / 0 / 0
Регистрация: 30.01.2020
Сообщений: 4
18.02.2020, 08:31  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
VrameeV, мой шедевр
В данном примере конечно перевод работает, но мне нужно что более универсальное. Как я говорил в основном проекте есть функции каждая из которых работает с определенным типом данных и между ними происходит обмен переменными, и если поменять определение местами то получаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <locale>
#include <string>
#include <vector>
#include <Windows.h>
 
 
// convert string to wstring
std::wstring to_wstring(const std::string& str,
    const std::locale& loc = std::locale())
{
    std::vector<wchar_t> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).widen(str.data(),
        str.data() + str.size(),
        buf.data());
    return std::wstring(buf.data(), buf.size());
}
 
// convert wstring to string with '?' as default character
std::string to_string(const std::wstring& str,
    const std::locale& loc = std::locale())
{
    std::vector<char> buf(str.size());
    std::use_facet<std::ctype<wchar_t>>(loc).narrow(str.data(),
        str.data() + str.size(),
        '?', buf.data());
    return std::string(buf.data(), buf.size());
}
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    std::wstring s = L"3-3 — копия.txt\n";
    std::string ws = to_string(s);
    std::wstring std = to_wstring(ws);
    std::cout << ws;
    std::wcout << std;
}
то вывод у нас получается

3-3 ? ?????.txt
3-3 ? ?????.txt
0
 Аватар для Recrut_rf
388 / 333 / 65
Регистрация: 14.10.2014
Сообщений: 1,440
18.02.2020, 08:56
Цитата Сообщение от Croessmah Посмотреть сообщение
так что такой метод определения конечного размера не верен
Спасибо, теперь буду иметь ввиду.
Но вообще, этот код - не моё творчество а просто пример из справочника по STL. В нем по-моему, ещё один пример был и возможно там даже указано про то, что вы сообщили - вникать было лень, потому как поздно было уже - спать очень хотелось , поэтому я просто вытащил код из самого первого примера - проверил - работает, ну и опубликовал.

Цитата Сообщение от VrameeV Посмотреть сообщение
но мне нужно что более универсальное
STL в помощь - и вперёд - удачи , она вам понадобится.
0
0 / 0 / 0
Регистрация: 25.09.2017
Сообщений: 19
02.11.2021, 23:50
Так работает без проблем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define _CRT_SECURE_NO_WARNINGS 1 //mbstowcs
#include <string>
#include <cstring> //strlen
#include <cstdlib> //mbstowcs
#include <iostream>
 
int main()
{
    //кодировка файла UTF с BOM
    //кодировка символов проекта юникод
    //шрифт консоли Lucida Console
    setlocale(LC_ALL, "");
    std::string str = "Русский язык";
    auto get_wchar = [](const char *c)->const wchar_t*
    {
        const size_t cSize = strlen(c) + 1;
        wchar_t* wc = new wchar_t[cSize];
        mbstowcs(wc, c, cSize);
        return wc;
    };
 
    const wchar_t* str_wchar = get_wchar(str.c_str());
    std::wstring wstr = str_wchar;
    delete[] str_wchar; //не забыть освободить память
    std::wcout << wstr;
}
0
0 / 0 / 0
Регистрация: 25.09.2017
Сообщений: 19
03.11.2021, 10:10
Или лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define _CRT_SECURE_NO_WARNINGS 1 //mbstowcs
#include <string>
#include <cstdlib> //mbstowcs
#include <iostream>
 
int main()
{
    //кодировка файла UTF с BOM
    //кодировка символов проекта юникод
    //шрифт консоли Lucida Console
    setlocale(LC_ALL, "");
    std::string str = "Русский язык";
 
    auto get_wstring = [](const std::string str)->std::wstring
    {
        const char *c = str.c_str();
        const size_t cSize = str.size() + 1;
        wchar_t* wc = new wchar_t[cSize];
        mbstowcs(wc, c, cSize);
        std::wstring w_string(wc);
        delete[] wc;
        return w_string;
    };
 
    std::wcout << get_wstring(str);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2021, 10:10
Помогаю со студенческими работами здесь

Корректен ли каст из string в wstring?
Доброго вечера. Вот кусок кода: template&lt; typename char_type &gt; string_t&lt;char_type&gt; make_string( const...

Из wchar_t* в wstring или в string
Как перевести из wchar_t* в wstring или в string ? Почему столько геморроя со строками... Есть функция, которая принимает wstring и...

Опять мучаюсь с конвертацией string в wstring
Опять парюсь с преобразованием string в wstring. Куча способов уже перепробовал, всё не то. То ли руки кривые, то ли всё дело в масонах и...

По поводу wchar_t, wstring, char, string и кодировок
Здравствуйте, пишу консольную либу которая будет работать с большим количеством символов в разных алфавитах, и кроссплатформенно, как я...

Не могу поместить в переменную wstring и string русское слово
Помогите пожалуйста , когда ввожу с клавиатуры в переменную string или wstring русское слово , то мне пишет иероглифы. Вот мой код : ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru