string s = "おはよう";
wstring ws = FUNCTION(s, ws);
如何将s的内容分配给ws?
搜索谷歌并使用了一些技术,但他们不能分配确切的内容。内容被扭曲了。
string s = "おはよう";
wstring ws = FUNCTION(s, ws);
如何将s的内容分配给ws?
搜索谷歌并使用了一些技术,但他们不能分配确切的内容。内容被扭曲了。
当前回答
使用Boost。地区:
ws = boost::locale::conv::utf_to_utf<wchar_t>(s);
其他回答
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;
}
String到wstring
std::wstring Str2Wstr(const std::string& str)
{
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
从wstring到String
std::string Wstr2Str(const std::wstring& wstr)
{
typedef std::codecvt_utf8<wchar_t> convert_typeX;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
假设您的示例(おはよう)中的输入字符串是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解决方案是安全的和可移植的。
使用Boost。地区:
ws = boost::locale::conv::utf_to_utf<wchar_t>(s);
Std::string -> wchar_t[]与安全mbstowcs_s函数:
auto ws = std::make_unique<wchar_t[]>(s.size() + 1);
mbstowcs_s(nullptr, ws.get(), s.size() + 1, s.c_str(), s.size());
这是我的示例代码