C++ 将字符串转换为wstring后输出为空,反之亦然

C++ 将字符串转换为wstring后输出为空,反之亦然,c++,non-ascii-characters,C++,Non Ascii Characters,用于Lì的ascii字符串 使用下面的循环 string s = "Forlì"; for(size_t i = 0; i < s.size(); i++) { printf("% d", s[i]); } wstring s = L"Forlì"; for(size_t i = 0; i < s.size(); i++) { printf("% d", s[i]); } 现在我想在这些类型之间进行转换,而不改变它们上面打印的任何值(而不是一些不同的编码)。由于

用于Lì的ascii字符串

使用下面的循环

string s = "Forlì";
for(size_t i = 0; i < s.size(); i++) {
    printf("% d", s[i]);
}

wstring s = L"Forlì";

for(size_t i = 0; i < s.size(); i++) {
    printf("% d", s[i]);
}
现在我想在这些类型之间进行转换,而不改变它们上面打印的任何值(而不是一些不同的编码)。由于我没有使用windows或c++11,我发现下面的例程给了我不满意的结果

std::wstring s2ws(const std::string& s) {
    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;
    return result;
}

std::wstring s2ws(const std::string& s) {
    wstring w;
    w.assign(s.begin(), s.end());
    return w;
}
当我使用第一个例程打印转换后的字符串时,它不会输出任何内容,而第二个例程不会将其转换为wstring(不将-61,-84更改为236)


如何正确地进行此转换?即使是不使用任何库函数来处理这些数字的算法也足够了…

您自己看到答案了吗,最上面的一个使用c++11,许多其他的需要Windows,我在问题中提到的rest 2策略。我需要找到我的代码中不正确的地方假设您试图转换常规UTF8,我认为您在执行转换之前缺少建立区域设置。你想完成什么?是的,确实如此。非常感谢。你能告诉我setlocale函数的作用域是什么吗?我的意思是,我不想改变整个应用程序的原始区域设置,只是在那个特定的函数上。你可以阅读这个函数。我记得,对于您指定的类型,它是全局的。还有潜在的线程问题。我演示的示例有点不好,因为它不能保存一个旧的区域设置的副本,一旦使用完毕,就要恢复它,所以你也应该考虑一下。无论如何,祝你好运。
std::wstring s2ws(const std::string& s) {
    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;
    return result;
}

std::wstring s2ws(const std::string& s) {
    wstring w;
    w.assign(s.begin(), s.end());
    return w;
}