问题是如何将wstring转成string?
我有下一个例子:
#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转换为字符串。
最佳答案
正如 Cubbi 在其中一条评论中指出的那样,std::wstring_convert
(C++11) 提供了一个简洁的解决方案(您需要 #include
<locale>
和 <codecvt>
):
std::wstring string_to_convert;
//setup converter
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );
我使用了 wcstombs
的组合以及在我遇到这个之前繁琐的内存分配/释放。
http://en.cppreference.com/w/cpp/locale/wstring_convert
更新(2013.11.28)
可以这么说(感谢 Guss 的评论):
std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some string");
包装函数可以这样表述:(感谢 ArmanSchwarz 的评论)
std::wstring s2ws(const std::string& str)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
std::string ws2s(const std::wstring& wstr)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
注意:关于 string
是否存在一些争议/wstring
应该作为引用或文字传递给函数(由于 C++11 和编译器更新)。我将把决定留给实现者,但值得知道。
注意:我使用的是 std::codecvt_utf8
在上面的代码中,但如果您不使用 UTF-8,则需要将其更改为您正在使用的适当编码:
关于c++ - 如何将 wstring 转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804298/