C ++ Преобразование строки (или char *) в wstring (или wchar_t *) - PullRequest
147 голосов
/ 04 апреля 2010
string s = "おはよう";
wstring ws = FUNCTION(s, ws);

Как бы я назначил содержимое s для ws?

Поиск в Google и использование некоторых методов, но они не могут назначить точное содержание. Содержание искажено.

Ответы [ 15 ]

1 голос
/ 27 октября 2015

На основании моего собственного тестирования (в Windows 8, версия 2010) mbstowcs может фактически повредить исходную строку, она работает только с кодовой страницей ANSI. Если MultiByteToWideChar / WideCharToMultiByte также может привести к повреждению строки - но они имеют тенденцию заменять символы, которые они не знают, на «?» вопросительные знаки, но mbstowcs имеет тенденцию останавливаться, когда встречает неизвестный символ и обрезает строку в этой самой точке. (Я проверил вьетнамские символы на финских окнах).

Так что предпочитайте Multi * -Windows API-функции, чем аналоговые функции ANSI C.

Кроме того, я заметил, что самый короткий способ кодирования строки из одной кодовой страницы в другую - это не вызовы API-функций MultiByteToWideChar / WideCharToMultiByte, а их аналоговые макросы ATL: W2A / A2W.

Таким образом, аналоговая функция, как упоминалось выше, звучит так:

wstring utf8toUtf16(const string & str)
{
   USES_CONVERSION;
   _acp = CP_UTF8;
   return A2W( str.c_str() );
}

_acp объявлен в макросе USES_CONVERSION.

Или также функция, которую я часто упускаю при выполнении преобразования старых данных в новые:

string ansi2utf8( const string& s )
{
   USES_CONVERSION;
   _acp = CP_ACP;
   wchar_t* pw = A2W( s.c_str() );

   _acp = CP_UTF8;
   return W2A( pw );
}

Но обратите внимание, что эти макросы используют большой стек - не используйте для циклов или рекурсивных циклов для одной и той же функции - после использования макроса W2A или A2W - лучше возвращать как можно скорее, так что стек будет освобожден от временного преобразования.

1 голос
/ 03 сентября 2013

метод s2ws работает хорошо. Надежда помогает.

std::wstring s2ws(const std::string& s) {
    std::string curLocale = setlocale(LC_ALL, ""); 
    const char* _Source = s.c_str();
    size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    std::wstring result = _Dest;
    delete []_Dest;
    setlocale(LC_ALL, curLocale.c_str());
    return result;
}
0 голосов
/ 01 апреля 2019

Если у вас есть QT и вам лень реализовывать функцию и прочее, вы можете использовать

std :: string str; QString (ул) .toStdWString ()

0 голосов
/ 08 апреля 2015

используйте этот код для преобразования вашей строки в wstring

std::wstring string2wString(const std::string& s){
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

int main(){
    std::wstring str="your string";
    std::wstring wStr=string2wString(str);
    return 0;
}
0 голосов
/ 04 апреля 2010

string s = "おはよう"; - ошибка.

Вы должны использовать wstring напрямую:

wstring ws = L"おはよう";
...