我想知道是否有更简单的方法(更简洁)将const char_t*
转换为std::string_t
而非下方:
typedef wchar_t char_t;
typedef basic_string<char_t> string_t;
std::wstring ws(script_->GetName()); //GetName() returns const char_t*
const std::string wsStr(ws.begin(), ws.end());
const string_t script_name(wsStr.begin(), wsStr.end());
任何帮助都将不胜感激。
修改
#ifdef OS_WIN
#include <tchar.h>
typedef wchar_t char_t;
#define CHAR_WIDE
#else
typedef char char_t;
答案 0 :(得分:6)
从您拥有的typedef
开始,归结为您要将wchar_t const*
字符串转换为std::basic_string<wchar_t>
。您可以将wchar_t const*
字符串的范围传递给std::basic_string<wchar_t>
的构造函数:
wchar_t const *str = L"abcdefgh";
const std::basic_string<wchar_t> script_name(str, str + std::char_traits<wchar_t>::length(str));
答案 1 :(得分:3)
您有三种常见情况:
wchar_t*
必须指向仅ASCII的值,并且您需要ASCII中的std::string
。wchar_t*
可能指向非ASCII字符,并且您希望std::string
具有宽字符wchar_t*
可能指向非ASCII字符,而您希望UTF-8中有std::string
。通常情况3是最好的,因为它最不可能在程序的其他地方引起问题。但它也是最难处理的,因为你需要提供自己的例程来将宽字符转换为UTF-8。网上有大量可用于该工作的C ++源文件。
1:
std::string answer;
for(i=0;i<N;i++)
answer.push_back( (char) wcharptr[i]);
对于2,相同的代码,但您需要使用您想要的宽类型模板回答,并且显然删除了char
强制转换。这就是生活变得困难的原因,以及为什么会有不良之处,因为如果不小心你最终会得到很多不同类型的std::string
。
3:
std::string answer;
for(i=0;i<N;i++)
{
char utf8[8];
int Nutf8;
int ii;
Nutf8 = widetoutf8(utf8, wcharptr[i]);
for(ii=0;ii<Nutf8;ii++)
answer.push_back(utf8[ii]);
}
您必须提供widetoutf8()
或同等资格。