2010-12-02 4 views
24

Я изменил свой класс для использования зОго :: строки (на основе ответа я получил here, но функцию у меня есть возврат wchar_t * Как преобразовать его в StD :: строкаКак преобразовать wchar_t * в std :: string? .?

Я попытался это:

std::string test = args.OptionArg(); 

, но он говорит C2440 ошибки: 'инициализации': не удается преобразовать из 'wchar_t *' до 'станд :: basic_string < _Elem, _Traits, _Ax>'

ответ

8

Вы могли бы просто использовать wstring и держать все в Unicode

+1

и я до сих пор получить константный символ *, если я использую .c_str()? У меня есть другие функции, которые ожидают const char * – codefrog 2010-12-02 21:16:58

+1

Я собираюсь предположить, что вы строите свой проект в Юникоде, но на самом деле этого не хотите. Если это правильно, вы можете изменить свойства своего проекта, чтобы не строить для Unicode, а затем вы можете использовать `string`. Проверьте это в свойствах проекта, свойствах конфигурации, общем наборе символов. Вам нужно это, чтобы сказать «Использовать многобайтовый набор символов», чтобы избавиться от Unicode повсюду. – 2010-12-02 21:19:41

+0

Первоначально я планировал использовать Unicode для некоторых частей, но потом решил, что позже об этом позабочусь. На данный момент мне только надоело, чтобы программа работала. Я использую SimpleINI и SimpleOpt для загрузки параметров, и он использует Unicode. Я также использую SDK другого программного обеспечения, которое также использует Unicode. Отключение Unicode вместе может привести к тому, что даже те части кода перестанут работать. – codefrog 2010-12-02 21:22:17

6

Вы можете преобразовать широкий символьную строку в строку ASCII, используя следующую функцию:

#include <locale> 
#include <sstream> 
#include <string> 

std::string ToNarrow(const wchar_t *s, char dfault = '?', 
         const std::locale& loc = std::locale()) 
{ 
    std::ostringstream stm; 

    while(*s != L'\0') { 
    stm << std::use_facet< std::ctype<wchar_t> >(loc).narrow(*s++, dfault); 
    } 
    return stm.str(); 
} 

Имейте в виду, что это будет просто заменить любой широкий характер, для которых эквивалент ASCII символов не существует с параметром dfault; он не конвертируется из UTF-16 в UTF-8. Если вы хотите конвертировать в UTF-8, используйте библиотеку, такую ​​как ICU.

5

Это старый вопрос, но если это так, вы на самом деле не стремится преобразования, а используя материал TCHAR от Mircosoft, чтобы иметь возможность создавать как ASCII и Unicode, вы могли бы вспомнить, что зЬй :: строка действительно

typedef std::basic_string<char> string 

Таким образом, мы можем определить наши собственные ЬурейеЕ, скажем

#include <string> 
namespace magic { 
typedef std::basic_string<TCHAR> string; 
} 

Тогда вы могли бы использовать magic::string с TCHAR, LPCTSTR и так далее

0

просто для удовольствия :-):

const wchar_t* val = L"hello mfc"; 
std::string test((LPCTSTR)CString(val)); 
Смежные вопросы