string s = "おはよう";
wstring ws = FUNCTION(s, ws);
如何将s的内容分配给ws?
搜索谷歌并使用了一些技术,但他们不能分配确切的内容。内容被扭曲了。
string s = "おはよう";
wstring ws = FUNCTION(s, ws);
如何将s的内容分配给ws?
搜索谷歌并使用了一些技术,但他们不能分配确切的内容。内容被扭曲了。
当前回答
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;
}
其他回答
假设您的示例(おはよう)中的输入字符串是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解决方案是安全的和可移植的。
这是我的超级基本解决方案,可能并不适用于所有人。但对很多人都适用。
它需要使用指南支持库。 这是一个非常官方的c++库,由许多c++委员会的作者设计:
https://github.com/isocpp/CppCoreGuidelines https://github.com/Microsoft/GSL
std::string to_string(std::wstring const & wStr)
{
std::string temp = {};
for (wchar_t const & wCh : wStr)
{
// If the string can't be converted gsl::narrow will throw
temp.push_back(gsl::narrow<char>(wCh));
}
return temp;
}
我的函数所做的只是允许转换。否则抛出异常。
通过使用gsl::narrow (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es49-if-you-must-use-a-cast-use-a-named-cast)
string s =“早上好”;is an error。
你应该直接使用wstring:
wstring ws = L"おはよう";
这是一种将字符串,wstring和混合字符串常量组合到wstring的方法。使用wstringstream类。
这并不适用于多字节字符编码。这只是一种抛弃类型安全并将std::string中的7位字符扩展到std:wstring中每个字符的下7位的愚蠢方法。只有当你有一个7位ASCII字符串并且你需要调用一个需要宽字符串的API时,这才有用。
#include <sstream>
std::string narrow = "narrow";
std::wstring wide = L"wide";
std::wstringstream cls;
cls << " abc " << narrow.c_str() << L" def " << wide.c_str();
std::wstring total= cls.str();
使用Boost。地区:
ws = boost::locale::conv::utf_to_utf<wchar_t>(s);