c++ - 如何将 wstring 转换为字符串?

标签 c++ unicode stl wstring

问题是如何将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,则需要将其更改为您正在使用的适当编码:

http://en.cppreference.com/w/cpp/header/codecvt

关于c++ - 如何将 wstring 转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804298/

相关文章:

c++ - 当 return 语句、逗号运算符、花括号初始化列表和 std::unique_ptr 组合在一起时

c++ - 匹配 Google Test 的 ASSERT_DEATH 正则表达式中的行尾

c++ - 使用 make 和自动依赖项构建程序

java - 在java中转换为utf-8

c++ - 移动 std::deque 后引用/指针是否保证有效?

c++ - 静态成员显式定义

Python:字节到带有重音字符的字符串

html - 如何在 HTML 选择选项的显示文本中使用超标或下标标签?

c++ - 将 const 引用转换为 const 指针

c++ - 需要一些关于 C++ 中简单无损压缩算法的想法