Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.98
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

Std::string and std::wstring convert - C++

02.10.2014, 11:47. Просмотров 9480. Ответов 20
Метки нет (Все метки)

случайно наткнулся на такую вот конвертацию std::string в std::wstring

C++
1
2
3
std::string text("text");
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wtext = converter.from_bytes(text);
а как можно сделать обратное преобразование? т.е. std::wstring в std::string? чтоб только вот как то по аналогии в пару строк можно было...

Добавлено через 2 минуты
а все отбой там же еще есть метод to_bytes тупанул

Добавлено через 15 часов 49 минут
погодите ка, написал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
std::wstring to_wstring(const std::string& text)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    return converter.from_bytes(text);
}
 
std::string to_string(const std::wstring& text)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    return converter.to_bytes(text);
}
но при попытке сконвертить русские символы падает с ошибкой "Необработанное исключение по адресу..."
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2014, 11:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Std::string and std::wstring convert (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)

Как привести std::wstring к std::string? - C++
Как привести std::wstring к std::string?

std::string -> std::wstring - C++
Как перевести данный код в код с использованием wstring ( посути использовать std::vector&lt;std::wstring&gt; refs; ) #include &lt;vector&gt; ...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') - C++
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

20
0x10
2510 / 1688 / 254
Регистрация: 24.11.2012
Сообщений: 4,233
02.10.2014, 11:49 #2
Какой был текст, в какой кодировке и какая конкретно функция упала?
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.10.2014, 11:51  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Какой был текст, в какой кодировке и какая конкретно функция упала?
текст был "текст", упала функция to_wstring
0
0x10
2510 / 1688 / 254
Регистрация: 24.11.2012
Сообщений: 4,233
02.10.2014, 12:21 #4
Проверь, что кодировка была действительно utf8. Мне бы пока компилятор найти, который поддерживает эти функции...
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
02.10.2014, 12:34 #5
Цитата Сообщение от GetHelp Посмотреть сообщение
to_wstring
Её нельзя использовать для преобразования 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
std::string ws2s(const std::wstring& wstr, const std::locale& loc)
{
    if (wstr.empty())
        return std::string();
 
    typedef std::wstring::traits_type::state_type state_type;
    typedef std::codecvt<wchar_t, char, state_type> convert;
    
    const convert& cvt = std::use_facet<convert>(loc);
    std::string str(cvt.max_length()*wstr.size(), '\0');
    state_type state = state_type();
 
    const wchar_t* from_beg = &wstr[0];
    const wchar_t* from_end = from_beg + wstr.size();
    const wchar_t* from_nxt;
    char* to_beg = &str[0];
    char* to_end = to_beg + str.size();
    char* to_nxt;
    
    std::string::size_type sz = 0;
    std::codecvt_base::result r;
    do
    {
        r = cvt.out(state, from_beg, from_end, from_nxt,
                           to_beg,   to_end,   to_nxt);
        switch (r)
        {
        case std::codecvt_base::error:
            throw std::runtime_error("error converting wstring to string");
 
        case std::codecvt_base::partial:
            sz += to_nxt - to_beg;
            str.resize(2*str.size());
            to_beg = &str[sz];
            to_end = &str[0] + str.size();
            break;
 
        case std::codecvt_base::noconv:
            str.resize(sz + (from_end-from_beg)*sizeof(wchar_t));
            std::memcpy(&str[sz], from_beg,(from_end-from_beg)*sizeof(wchar_t));
            r = std::codecvt_base::ok;
            break;
 
        case std::codecvt_base::ok:
            sz += to_nxt - to_beg;
            str.resize(sz);
            break;
        }
    } while (r != std::codecvt_base::ok);
 
    return str;
}
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.10.2014, 12:36  [ТС] #6
MrGluck, что за???
0
0x10
02.10.2014, 12:52
  #7

Не по теме:

Не знаю насколько корректен/необходим код выше, но с кодировками каждый раз головняк. Посему вопрос: какая стоит исходная задача? Зачем нужно гонять string в wstring и обратно?

0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.10.2014, 13:13  [ТС] #8
Цитата Сообщение от 0x10 Посмотреть сообщение
Не знаю насколько корректен/необходим код выше, но с кодировками каждый раз головняк. Посему вопрос: какая стоит исходная задача? Зачем нужно гонять string в wstring и обратно?
а не все ли равно? просто нужна wstring строка, какая разница как она потом будет использоваться?
0
0x10
2510 / 1688 / 254
Регистрация: 24.11.2012
Сообщений: 4,233
02.10.2014, 13:17 #9
Цитата Сообщение от GetHelp Посмотреть сообщение
а не все ли равно? просто нужна wstring строка, какая разница как она потом будет использоваться?
Вот я и хочу понять: нужна ли она на самом деле и должна ли она до или после быть сконвертирована из/в std::string. И при чем тут кодировки.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.10.2014, 13:23  [ТС] #10
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот я и хочу понять: нужна ли она на самом деле и должна ли она до или после быть сконвертирована из/в std::string. И при чем тут кодировки.
что за странный вопрос нужна ли? если я говорю что мне нужна, то значит нужна иначе зачем бы я спрашивал? а про кодировки я вообще ничего не говорил...

Добавлено через 1 минуту
короче пофиг у меня уже был старый вариант конвертации
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::wstring _stdcall AnsiStringToWide(std::string const &Str, UINT CodePage = CP_ACP)
{
    DWORD const BuffSize = MultiByteToWideChar(CodePage, 0, Str.c_str(), -1, NULL, 0);
    if (!BuffSize) return NULL;
    std::vector<wchar_t> Buffer;
    Buffer.resize(BuffSize);
    if (!MultiByteToWideChar(CodePage, 0, Str.c_str(), -1, &Buffer[0], BuffSize)) return NULL;
    return (&Buffer[0]);
}
 
std::string _stdcall WideStringToAnsi(std::wstring const &Str, UINT CodePage = CP_ACP)
{
    DWORD const BuffSize = WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, NULL, 0, NULL, NULL);
    if (!BuffSize) return NULL;
    std::vector<char> Buffer;
    Buffer.resize(BuffSize);
    if (!WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, &Buffer[0], BuffSize, NULL, NULL)) return NULL;
    return (&Buffer[0]);
}
просто этот был короче намного, вот я и подумал что будет норм... но раз в wstring так не сконвертишь то печалька придется юзать старый...
0
0x10
2510 / 1688 / 254
Регистрация: 24.11.2012
Сообщений: 4,233
02.10.2014, 13:28 #11
Цитата Сообщение от GetHelp Посмотреть сообщение
а про кодировки я вообще ничего не говорил...
Тем не менее в коде в первом посте использован std::codecvt_utf8_utf16:
std::codecvt_utf8_utf16 is a std::codecvt facet which encapsulates conversion between a UTF-8 encoded byte string and UTF-16 encoded character string.
Ладно, не важно.
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
02.10.2014, 13:35 #12
Цитата Сообщение от MrGluck Посмотреть сообщение
Её нельзя использовать для преобразования string в wstring.
Воу-воу-воу, я конечно не знаток, но твой код на первый взгляд не сильно отличается от того, как реализован std::wstring_convert. Что там по-твоему не так-то?

Добавлено через 3 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
UINT CodePage = CP_ACP
Ты уж определись-то, utf-8 тебе надо или кодировку текущей локали винды
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.10.2014, 13:37  [ТС] #13
Цитата Сообщение от Voivoid Посмотреть сообщение
Ты уж определись-то, utf-8 тебе надо или кодировку текущей локали винды
я без понятия, я просто содрал где то тот код... да и этот тоже мне важно сконвертить и мне фиолетово как это будет выглядеть внутри, точнее если покороче будет я только за
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
02.10.2014, 15:25 #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Воу-воу-воу, я конечно не знаток, но твой код на первый взгляд не сильно отличается от того, как реализован std::wstring_convert. Что там по-твоему не так-то?
Convert numerical value to string
http://www.cplusplus.com/reference/string/to_wstring/
Цитата Сообщение от GetHelp Посмотреть сообщение
мне важно сконвертить и мне фиолетово как это будет выглядеть внутри, точнее если покороче будет я только за
Надо всё-таки знать кодировку, в которую нужно сконвертировать данные. Иначе получается "иди туда, не знаю куда, принеси то, не знаю что"
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
02.10.2014, 15:51 #15
Цитата Сообщение от MrGluck Посмотреть сообщение
Э-э-э, а это к чему вообще? Я может что-то не заметил, но речь-то вроде о std::wstring_convert? При чем тут std::to_wstring ?
0
02.10.2014, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2014, 15:51
Привет! Вот еще темы с ответами:

Ошибка Cannot convert std::string to void* - C++
Не могу сконвертировать строку в void*: std::string str; (void*)str; Вернее invalid cast from type std::string to type void* ...

cannot convert parameter 1 from 'int' to 'std::string &' - C++
string kolvo(string &amp;S, int &amp;k) { unsigned int i; for(i=1; i&lt;S.length(); i++) if(S=='B' &amp;&amp; S==' ') k=k+1; } ...

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.