string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 20:49
Оценка: -1
Hi!

Опять проблемы с преобразованием строк

Есть CentOS 7 и необходимость конвертировать string в wstring, но вот как?
Подскажите СУПЕР_ФУНКЦИЮ
#include <iostream>

using namespace std;

int main()
{
    setlocale(LC_ALL, "ru_RU.utf8");
    
    string s = "Привет это я Ы-ы-ы";
    wstring ws = L"Привет это я Ы-ы-ы";
    
    wstring c =  СУПЕР_ФУНКЦИЯ (s);

    if (ws.compare(c)==0)
        cout << "Вау" << endl;
    else
        cout << ":(" << endl;

    return 0;
}


Рыл инет упорно, но все ф-ции ВАУ не делали...
Программист — это не профессия... это диагноз.
Re: string to wstring
От: Razard Россия  
Дата: 29.10.15 20:55
Оценка: :)
Здравствуйте, LeoMonster, Вы писали:

LM>Hi!


LM>Опять проблемы с преобразованием строк


LM>Есть CentOS 7 и необходимость конвертировать string в wstring, но вот как?

LM>Подскажите СУПЕР_ФУНКЦИЮ
LM>
LM>#include <iostream>

LM>using namespace std;

LM>int main()
LM>{
LM>    setlocale(LC_ALL, "ru_RU.utf8");
    
LM>    string s = "Привет это я Ы-ы-ы";
LM>    wstring ws = L"Привет это я Ы-ы-ы";
    
LM>    wstring c =  СУПЕР_ФУНКЦИЯ (s);

LM>    if (ws.compare(c)==0)
LM>        cout << "Вау" << endl;
LM>    else
LM>        cout << ":(" << endl;

LM>    return 0;
LM>}
LM>


LM>Рыл инет упорно, но все ф-ции ВАУ не делали...


std::wstring c(s.begin(),s.end());
Re[2]: string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 21:00
Оценка:
Здравствуйте, Razard, Вы писали:


Программист — это не профессия... это диагноз.
Отредактировано 29.10.2015 21:01 LeoMonster . Предыдущая версия .
Re: string to wstring
От: Dair Россия  
Дата: 29.10.15 21:11
Оценка: 1 (1)
Здравствуйте, LeoMonster, Вы писали:

LM>Опять проблемы с преобразованием строк

LM>Есть CentOS 7 и необходимость конвертировать string в wstring, но вот как?
LM>Подскажите СУПЕР_ФУНКЦИЮ

libiconv:

Собсно функция iconv:
#include <iconv.h>

size_t iconv (iconv_t cd,
              const char* * inbuf, size_t * inbytesleft,
              char* * outbuf, size_t * outbytesleft);
Отредактировано 29.10.2015 21:11 Dair . Предыдущая версия .
Re[2]: string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 21:33
Оценка:
Здравствуйте, Dair, Вы писали:

D>Здравствуйте, LeoMonster, Вы писали:


LM>>Опять проблемы с преобразованием строк

LM>>Есть CentOS 7 и необходимость конвертировать string в wstring, но вот как?
LM>>Подскажите СУПЕР_ФУНКЦИЮ

D>libiconv:


D>Собсно функция iconv:

D>
D>#include <iconv.h>

D>size_t iconv (iconv_t cd,
D>              const char* * inbuf, size_t * inbytesleft,
D>              char* * outbuf, size_t * outbytesleft);

D>


Не могу разобраться как её тут применить, можно пример?
Программист — это не профессия... это диагноз.
Re[3]: string to wstring
От: Dair Россия  
Дата: 29.10.15 21:44
Оценка:
Здравствуйте, LeoMonster, Вы писали:

D>>libiconv:


LM>Не могу разобраться как её тут применить, можно пример?


Пример лень, полпервого ночи на дворе.
Что непонятно-то? Подставить нужную перекодировку (две кодировки, откуда и куда). Входные данные, выходные данные. Из выходных сделать wstring. Всё.
Отредактировано 29.10.2015 21:44 Dair . Предыдущая версия .
Re: string to wstring
От: Nikе Россия  
Дата: 29.10.15 21:44
Оценка:
Здравствуйте, LeoMonster, Вы писали:


std::string UtfWToUtf8( const wchar_t* str )
{
    if ( str && str[0] )
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
        return conv1.to_bytes( str, str + wcslen( str ) );
    }
    return std::string();
}

std::wstring Utf8ToUtfW( const char* str )
{
    if ( str && str[0] )
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
        return conv1.from_bytes( str, str + strlen( str ) );
    }
    return std::wstring();
}
Нужно разобрать угил.
Re[2]: string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 22:29
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, LeoMonster, Вы писали:


N>

N>std::string UtfWToUtf8( const wchar_t* str )
N>{
N>    if ( str && str[0] )
N>    {
N>        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
N>        return conv1.to_bytes( str, str + wcslen( str ) );
N>    }
N>    return std::string();
N>}

N>std::wstring Utf8ToUtfW( const char* str )
N>{
N>    if ( str && str[0] )
N>    {
N>        std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
N>        return conv1.from_bytes( str, str + strlen( str ) );
N>    }
N>    return std::wstring();
N>}

N>


error: ‘wstring_convert’ is not a member of ‘std’
The reason why GCC rejects this code is simple: libstdc++ doesn't support <codecvt> yet.
Программист — это не профессия... это диагноз.
Re[3]: string to wstring
От: Nikе Россия  
Дата: 29.10.15 22:44
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>error: ‘wstring_convert’ is not a member of ‘std’

LM>The reason why GCC rejects this code is simple: libstdc++ doesn't support <codecvt> yet.

Хм, ну тогда iconv_string.

char* result = nullptr;
const char* src = ...;
#define WCHART_ALIAS "UTF-32LE" // android
#define WCHART_ALIAS "wchar_t" // linux

if( iconv_string ("UTF-8", WCHART_ALIAS, src, src + strlen( src ), &result, &size ) != 0 )
{
failed;
}
else
{
successful;
}
Нужно разобрать угил.
Отредактировано 29.10.2015 22:47 Nikе . Предыдущая версия . Еще …
Отредактировано 29.10.2015 22:47 Nikе . Предыдущая версия .
Отредактировано 29.10.2015 22:46 Nikе . Предыдущая версия .
Re: string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 22:58
Оценка:
Здравствуйте, LeoMonster, Вы писали:

Вот что помогло
#include <iostream>
#include <string.h>

using namespace std;

const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}

int main()
{
    setlocale(LC_ALL, "ru_RU.utf8");

    string s = "Привет это я Ы-ы-ы";
    wstring ws = L"Привет это я Ы-ы-ы";
    wstring c(GetWC(s.c_str()));

    if (ws.compare(c)==0)
        cout << "Вау" << endl;
    else
        cout << ":(" << endl;

    return 0;
}
Программист — это не профессия... это диагноз.
Re[2]: string to wstring
От: Nikе Россия  
Дата: 29.10.15 23:12
Оценка: +1
Здравствуйте, LeoMonster, Вы писали:

Ты в курсе, что длина строк в char совсем не обязана соответствовать длине строк в wchar_t?

P.S.
Даже при всяких uppercase и lowercase может длина буфера меняться даже для таких банальных языков как немецкий.
Нужно разобрать угил.
Re: string to wstring
От: c-smile Канада http://terrainformatica.com
Дата: 29.10.15 23:24
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>Рыл инет упорно, но все ф-ции ВАУ не делали...


include "aux-cvt.h" 

string s = "Привет это я Ы-ы-ы";
wstring c =  aux::utf2w(s);


aux-cvt.h это файл из sciter SDK. Header only implementation utf8 <-> wide string.
Re[3]: string to wstring
От: LeoMonster Россия http://ix-group.ru
Дата: 29.10.15 23:42
Оценка:
Здравствуйте, Nikе, Вы писали:

Конечно!
Поправил код.

#include <iostream>
#include <string.h>

using namespace std;

const wchar_t *GetWC(const char *c)
{
    //const size_t cSize = strlen(c)+1;
    const size_t mbslen = mbstowcs(NULL, c, 0);
    wchar_t* wc = new wchar_t[mbslen+1];
    mbstowcs (wc, c, mbslen);

    return wc;
}

int main()
{
    setlocale(LC_ALL, "ru_RU.utf8");

    string s = "Привет это я Ы-ы-ы";
    wstring ws = L"Привет это я Ы-ы-ы";
    wstring c(GetWC(s.c_str()));

    if (ws.compare(c)==0)
        cout << "Вау" << endl;
    else
        cout << ":(" << endl;

    return 0;
}
Программист — это не профессия... это диагноз.
Re[4]: string to wstring
От: Nikе Россия  
Дата: 29.10.15 23:51
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>Конечно!

LM>Поправил код.

Меморилик
Нужно разобрать угил.
Re: string to wstring
От: Bork СССР  
Дата: 30.10.15 03:53
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>Hi!


LM>Опять проблемы с преобразованием строк


LM>Есть CentOS 7 и необходимость конвертировать string в wstring, но вот как?

LM>Подскажите СУПЕР_ФУНКЦИЮ
LM>Рыл инет упорно, но все ф-ции ВАУ не делали...

#include <boost/locale.hpp>

string s = "Привет это я Ы-ы-ы";
std::wstring wstr = boost::locale::conv::to_utf<wchar_t>(s, "cp1251");
Re: string to wstring
От: ArtDenis Россия  
Дата: 30.10.15 06:31
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>Опять проблемы с преобразованием строк


Т.к. строка в UTF8, то вот так:

#include <boost/locale.hpp>
wstring c = boost::locale::conv::utf_to_utf<wchar_t>(s);


PS: Не компилил
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: string to wstring
От: Dair Россия  
Дата: 01.11.15 07:31
Оценка: :))
Здравствуйте, ArtDenis, Вы писали:

AD>
AD>#include <boost/locale.hpp>
AD>


Тянуть в проект многомегабайтный геморройный буст?..
Re: string to wstring
От: Serpuh фотомер.рф
Дата: 01.11.15 09:56
Оценка:
У меня так сделано, все работает

 std::wstring AStringToWString(const char* str)
  {
    int Len = static_cast<int>(::strlen(str) + 1);
    std::vector<wchar_t> Buffer(Len);
    ::MultiByteToWideChar(CP_ACP, 0, str, -1, &Buffer.front(), Len);
    return &Buffer.front();
  }
Re[4]: string to wstring
От: Teolog  
Дата: 01.11.15 10:35
Оценка:
И, как и предполагалось, утечка памяти)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.