将const wchar_t *转换为const std :: basic_string <char_t>的更好方法

时间:2016-10-04 06:37:29

标签: c++ c++11

我想知道是否有更简单的方法(更简洁)将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;

2 个答案:

答案 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));

Live Demo

答案 1 :(得分:3)

您有三种常见情况:

  1. wchar_t*必须指向仅ASCII的值,并且您需要ASCII中的std::string
  2. wchar_t*可能指向非ASCII字符,并且您希望std::string具有宽字符
  3. wchar_t*可能指向非ASCII字符,而您希望UTF-8中有std::string
  4. 通常情况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()或同等资格。