#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:
У вас есть три общие ситуации:
wchar_t*
должно указывать только на значения в формате ASCII, а вы хотите astd::string
в ASCII.wchar_t*
может указывать на символ, отличный от ASCII, и вам нужно astd::string
с широкими символамиwchar_t*
может указывать на символы, отличные от ASCII, и вы хотите astd::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()
или эквивалент.