我使用std :: string作为文本缓冲区。然后,我确信该缓冲区中包含的数据是UTF-16(即它实际上是一个std :: wstring)。 如何将std :: string强制转换为std :: wstring? std :: string是用词不当,数据实际上是一个wstring。
答案 0 :(得分:4)
考虑使用std::vector<char>
代替std::string
。当你想要“连续的字节序列”时,它是正确的容器。
使用std::vector
源容器,代码相当简单,假设您真的只想重新解释数据(即,您真的只想将字节视为{{1}的序列}):
wchar_t
如果您的来源是std::vector<char> v = get_my_wstring_character_data();
if (v.size() % sizeof (wchar_t) != 0)
throw std::runtime_error("Invalid wstring length");
std::wstring ws(reinterpret_cast<wchar_t*>(&v[0]),
reinterpret_cast<wchar_t*>(&v[0] + v.size()));
,如果您可以保证您使用的std::string
的实现连续存储其字符,则同样的方法将起作用。在实践中,情况总是如此。
答案 1 :(得分:1)
无法保证std::wstring
将字节数组存储/解释为UTF-16(尽管发生在Windows中执行此操作)。看看这个问题:std::wstring VS std::string
因此,我建议您重新考虑从UTF-16编码的字节数组构造std::wstring
的想法,除非您确定您的应用程序只能用MSVC编译。