Как конвертировать std :: wstring в TCHAR * - PullRequest
3 голосов
/ 03 декабря 2009

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

Как мне добраться от wchar_t * до TCHAR * или от std :: wstring до TCHAR *

Спасибо

Ответы [ 6 ]

6 голосов
/ 03 января 2016

используйте это:

wstring str1(L"Hello world");
TCHAR * v1 = (wchar_t *)str1.c_str();
4 голосов
/ 04 декабря 2009
#include <atlconv.h>

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

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

2 голосов
/ 16 мая 2010

in general это невозможно, так как wchar_t может не совпадать с размером TCHAR.

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

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

typedef std::basic_string<TCHAR> tstring;

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

2 голосов
/ 03 декабря 2009

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
1 голос
/ 03 декабря 2009

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

wstring ws = L"Testing123";
string s(ws.begin(), ws.end());
// s.c_str() is what you're after
0 голосов
/ 03 декабря 2009

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

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

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

...