如何将 wstring 转换为字符串?

新手上路,请多包涵

问题是如何将 wstring 转换为字符串?

我有下一个例子:

 #include <string>
#include <iostream>

int main()
{
    std::wstring ws = L"Hello";
    std::string s( ws.begin(), ws.end() );

  //std::cout <<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;
    std::cout <<"std::string =     "<<s<<std::endl;
}

带有注释行的输出是:

 std::string =     Hello
std::wstring =    Hello
std::string =     Hello

但没有只是:

 std::wstring =    Hello

这个例子有什么问题吗?我可以像上面那样进行转换吗?

编辑

新示例(考虑到一些答案)是

#include <string>
#include <iostream>
#include <sstream>
#include <locale>

int main()
{
    setlocale(LC_CTYPE, "");

    const std::wstring ws = L"Hello";
    const std::string s( ws.begin(), ws.end() );

    std::cout<<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;

    std::stringstream ss;
    ss << ws.c_str();
    std::cout<<"std::stringstream =     "<<ss.str()<<std::endl;
}

输出是:

 std::string =     Hello
std::wstring =    Hello
std::stringstream =     0x860283c

因此 stringstream 不能用于将 wstring 转换为字符串。

原文由 BЈовић 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
2 个回答

这是基于其他建议的解决方案:

 #include <string>
#include <iostream>
#include <clocale>
#include <locale>
#include <vector>

int main() {
  std::setlocale(LC_ALL, "");
  const std::wstring ws = L"ħëłlö";
  const std::locale locale("");
  typedef std::codecvt<wchar_t, char, std::mbstate_t> converter_type;
  const converter_type& converter = std::use_facet<converter_type>(locale);
  std::vector<char> to(ws.length() * converter.max_length());
  std::mbstate_t state;
  const wchar_t* from_next;
  char* to_next;
  const converter_type::result result = converter.out(state, ws.data(), ws.data() + ws.length(), from_next, &to[0], &to[0] + to.size(), to_next);
  if (result == converter_type::ok or result == converter_type::noconv) {
    const std::string s(&to[0], to_next);
    std::cout <<"std::string =     "<<s<<std::endl;
  }
}

这通常适用于 Linux,但会在 Windows 上产生问题。

原文由 Philipp 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您正在处理文件路径(当我发现需要 wstring-to-string 时经常这样做),您可以使用 filesystem::path (C++17 起):

 #include <filesystem>

const std::wstring wPath = GetPath(); // some function that returns wstring
const std::string path = std::filesystem::path(wPath).string();

原文由 tim_hutton 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题