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

Перевод string в wstring

17.02.2020, 19:37. Показов 14626. Ответов 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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
381 / 324 / 65
Регистрация: 14.10.2014
Сообщений: 1,377
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru