2009-12-03 6 views
2

std :: wstring.c_str() renvoie un wchar_t *.Comment convertir std :: wstring en TCHAR *

Comment puis-je obtenir de wchar_t * à TCHAR *, ou de std :: wstring à TCHAR *

Merci

+0

S'il vous plaît garder à l'esprit que cela est possible que si wstring ne contient que des caractères ANSI. Ne vous attendez pas à ce que le résultat de la solution suggérée soit une chaîne correcte à tout moment. En fait, si vous devez le faire, cela signifie probablement qu'il y a quelque chose qui ne va pas. Voir ma réponse ici: http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful/1855375#1855375 sur comment je crois que cette situation devrait être gérée, en évitant TCHAR complètement. –

Répondre

4
#include <atlconv.h> 

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

fera la bonne chose dans la norme ANSI ou Unicode construit.

+1

Et vous avez besoin de 'USES_CONVERSION;' devant W2T sinon il se plaindra: "erreur C2065: '_lpw': identificateur non déclaré" etc. – Deqing

2

TCHAR * est défini comme wchar_t * si UNICODE est défini, sinon il est char * . Votre code peut donc ressembler à ceci:

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 
0

En supposant que vous travaillez sous Windows. Si vous êtes en configuration de construction Unicode, alors TCHAR et wchar_t sont identiques. Vous pourriez avoir besoin d'un cast selon que vous avez/Z défini wchar_t est un type par rapport à wchar_t est un typedef.

Si vous êtes dans une configuration de construction multi-octets, vous avez besoin de MultiByteToWideChar (et inversement).

1

Vous pouvez utiliser:

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

en général ce n'est pas possible car wchar_t peut ne pas avoir la même taille que TCHAR.

Plusieurs solutions sont déjà répertoriées pour la conversion entre les jeux de caractères. ceux-ci peuvent fonctionner si les jeux de caractères se chevauchent pour la gamme en cours de conversion.

Je préfère contourner la question tout à chaque fois que possible et utiliser une chaîne standard qui est définie sur le caractère TCHAR défini comme suit:

typedef std::basic_string<TCHAR> tstring;

en utilisant ce que vous avez maintenant une bibliothèque standard chaîne compatible est également compatible avec la macro Windows TCHAR.

5

utiliser ceci:

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

erreur C2440: 'initialisation': impossible de convertir 'wchar_t *' en 'TCHAR * ' – Deqing

+0

Fonctionne parfaitement. Je vous remercie. –

Questions connexes