Лучший способ преобразовать const wchar_t * в const std::basic_string

#c #c 11

#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;
  

Комментарии:

1. typedef wchar_t char_t; Вы уверены в этом?

2. см. Редактирование, пожалуйста…

3. Что ты пытаешься сделать? Для преобразования std::string в std::wstring вы должны использовать std::iconv

4. @NulledPointer Я хочу, чтобы приведенный выше код был менее подробным. вот и все.

5. Нет std::string_t

Ответ №1:

Из typedef s, которые у вас есть, все сводится к тому, что вы хотите преобразовать wchar_t const* строку в a 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));
  

Живая демонстрация

Ответ №2:

У вас есть три общие ситуации:

  1. wchar_t* должно указывать только на значения в формате ASCII, а вы хотите a std::string в ASCII.
  2. wchar_t* может указывать на символ, отличный от ASCII, и вам нужно a std::string с широкими символами
  3. wchar_t* может указывать на символы, отличные от ASCII, и вы хотите a std::string в UTF-8 .

Как правило, ситуация 3 является наилучшей, поскольку с наименьшей вероятностью вызовет проблемы в других частях программы. Но с этим также сложнее всего справиться, так как вам нужно предоставить свои собственные процедуры для преобразования широких символов в UTF-8. В Интернете доступно множество исходных файлов C для этой работы.

Для 1:

 std::string answer;
for(i=0;i<N;i  )
    answer.push_back( (char) wcharptr[i]);
  

Для 2 тот же код, но вам нужно шаблонный ответ с широким типом, который вы хотите, и, очевидно, удалить char приведение. Вот где жизнь становится трудной, и почему это может быть нежелательным, потому что, если вы не будете осторожны, вы получите много std::string s с разными типами.

Для 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() или эквивалент.