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 header 在C++ 17中已弃用,因此引发了对该答案中提出的解决方案的一些担忧。但是,C++标准委员会在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0618r0.html中添加了重要声明



    因此,在可预见的将来,此答案中的codecvt解决方案是安全且可移植的。

    07-24 19:15
    查看更多