gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:59 24 4
gpt4 key购买 nike

问题是如何将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转换成string。

最佳答案

正如 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/18954446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com