string s = "おはよう";
wstring ws = FUNCTION(s, ws);

如何将s的内容分配给ws?

搜索谷歌并使用了一些技术,但他们不能分配确切的内容。内容被扭曲了。


当前回答

假设您的示例(おはよう)中的输入字符串是UTF-8编码的(从表面上看,它不是,但为了解释起见,让我们假设它是您感兴趣的Unicode字符串的表示形式:-),那么您的问题可以仅通过标准库(c++ 11或更新版本)完全解决。

TL;DR版本:

#include <locale>
#include <codecvt>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(wide_utf16_source_string);
std::wstring wide = converter.from_bytes(narrow_utf8_source_string);

更长的在线可编译和可运行的示例:

(它们都展示了相同的例子。只是有很多冗余……)

http://ideone.com/KA1oty http://ide.geeksforgeeks.org/5pRLSh http://rextester.com/DIJZK52174

备注(旧):

正如评论中指出并在https://stackoverflow.com/a/17106065/6345中解释的那样,在使用标准库在UTF-8和UTF-16之间进行转换时,在不同的平台上可能会产生意想不到的结果差异。为了更好的转换,请考虑http://en.cppreference.com/w/cpp/locale/codecvt_utf8上描述的std::codecvt_utf8

备注(新):

由于codecvt头文件在c++ 17中已弃用,因此有人对这个答案中提出的解决方案提出了一些担忧。然而,c++标准委员会在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0618r0.html中增加了一项重要声明

这个库组件应该退役到附件D中,直到一个合适的替换被标准化。

所以在可预见的未来,这个答案中的codecvt解决方案是安全的和可移植的。

其他回答

如果你有QT,如果你懒得实现一个函数和东西,你可以使用

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

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;
}

对我来说,最简单又没有大开销的选择是:

包括:

#include <atlbase.h>
#include <atlconv.h>

转换:

char* whatever = "test1234";
std::wstring lwhatever = std::wstring(CA2W(std::string(whatever).c_str()));

如果需要:

lwhatever.c_str();

从char*到wstring:

char* str = "hello worlddd";
wstring wstr (str, str+strlen(str));

从string到wstring:

string str = "hello worlddd";
wstring wstr (str.begin(), str.end());

注意,只有在被转换的字符串只包含ASCII字符时,这种方法才有效。

int StringToWString(std::wstring &ws, const std::string &s)
{
    std::wstring wsTmp(s.begin(), s.end());

    ws = wsTmp;

    return 0;
}