正如 Cubbi 在其中一条评论中指出的那样,std::wstring_convert
(C++11) 提供了一个简洁的解决方案(您需要#include
<locale>
and <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 http://en.cppreference.com/w/cpp/locale/wstring_convert
更新(2013.11.28)
一个衬垫可以这样表述(谢谢格斯的评论):
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,则需要将其更改为您正在使用的适当编码:
http://en.cppreference.com/w/cpp/header/codecvt http://en.cppreference.com/w/cpp/header/codecvt