string s = "おはよう";
wstring ws = FUNCTION(s, ws);
我如何将 s 的内容分配给 ws ?
搜索谷歌并使用了一些技术,但他们无法分配确切的内容。内容被扭曲。
NOTE! See 注意事项 (2023-10-05)在底部!
假设示例中的输入字符串 (おはよう) 是 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 之间进行转换可能会在不同平台上产生意外的结果差异。为了获得更好的转换,请考虑std::codecvt_utf8
如上所述http://en.cppreference.com/w/cpp/locale/codecvt_utf8
注意事项(新):
自从codecvt
header 在 C++17 中已弃用,有人对此答案中提出的解决方案表示担忧。然而,C++标准委员会在其中添加了一个重要声明http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0618r0.html saying
该库组件应与附件 D 一起退役,直到标准化合适的替代品。
所以在可预见的未来,codecvt
这个答案中的解决方案是安全且便携的。
注意事项 (2023-10-05):
删除已弃用的提案codecvt
and wstring_convert
在 C++26 中:
- 从 C++26 中删除已弃用的 Unicode 转换方面
- 从 C++26 中删除 wstring_convert
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)