Вопрос

std::wstring.c_str() возвращает wchar_t*.

Как перейти от wchar_t* к TCHAR* или от std::wstring к TCHAR*

Спасибо

Это было полезно?

Решение

#include <atlconv.h>

TCHAR *dst = W2T(src.c_str());

Будет делать правильные вещи в сборках ANSI или Unicode.

Другие советы

использовать это :

wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();

TCHAR* определяется как wchar_t*, если определен UNICODE, в противном случае это char*.Итак, ваш код может выглядеть примерно так:

wchar_t* src;
TCHAR* result;
#ifdef UNICODE
result = src;
#else
//I think W2A is defined in atlbase.h, and it returns a stack-allocated var.
//If that's not OK, look at the documenation for wcstombs.
result = W2A(src);
#endif

в общий это невозможно, поскольку размер wchar_t может отличаться от размера TCHAR.

уже перечислено несколько решений для преобразования между наборами символов.они могут работать, если наборы символов перекрываются для конвертируемого диапазона.

Я предпочитаю полностью обойти эту проблему, где это возможно, и использовать стандартную строку, определенную в наборе символов TCHAR следующим образом:

typedef std::basic_string<TCHAR> tstring;

используя это, вы теперь имеете строку, совместимую со стандартной библиотекой, которая также совместима с макросом Windows TCHAR.

Вы можете использовать:

wstring ws = L"Testing123";
string s(ws.begin(), ws.end());
// s.c_str() is what you're after

Предполагая, что вы работаете в Windows.

Если вы находитесь в конфигурации сборки Unicode, то TCHAR и wchar_t это одно и то же.Вам может потребоваться приведение в зависимости от того, установлен ли у вас параметр /Z для wchar_t — это тип, а wchar_t — это определение типа.

Если вы используете многобайтовую конфигурацию сборки, вам нужно MultiByteToWideChar (и наоборот).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top