58 votes

Convertir CString en const char*

Comment convertir de CString a const char* dans mon application MFC Unicode ?

5 votes

Le fait que vous construisiez un programme unicode est la clé de ce problème - S'IL VOUS PLAÎT, ajoutez cette information à la question. (ou que quelqu'un avec un représentant le fasse ?)

77voto

Rob Points 22239

Pour convertir un TCHAR CString en ASCII, utilisez la fonction CT2A qui vous permettra également de convertir la chaîne en UTF8 (ou toute autre page de code Windows) :

// Convert using the local code page
CString str(_T("Hello, world!"));
CT2A ascii(str);
TRACE(_T("ASCII: %S\n"), ascii.m_psz);

// Convert to UTF8
CString str(_T("Some Unicode goodness"));
CT2A ascii(str, CP_UTF8);
TRACE(_T("UTF8: %S\n"), ascii.m_psz);

// Convert to Thai code page
CString str(_T("Some Thai text"));
CT2A ascii(str, 874);
TRACE(_T("Thai: %S\n"), ascii.m_psz);

Il y a aussi une macro pour convertir de ASCII -> Unicode ( CA2T ) et vous pouvez les utiliser dans des applications ATL/WTL à condition d'avoir VS2003 ou une version supérieure.

Voir le MSDN pour plus d'informations.

0 votes

J'ai déjà eu la réponse à la question un peu plus tôt et vous avez raison, j'ai utilisé la macro CT2A. Merci.

0 votes

Vous pouvez également faire TRACE(_T("ASCII : %S \n "), CT2A(str).m_psz) ;

0 votes

CA2T fait no convertir en Unicode. Il convertit en un TCHAR qui peuvent ou non représenter des caractères Unicode. CA2[C]W est la macro qui convertit en Unicode.

23voto

Mark Ransom Points 132545

Si votre CString est unicode, vous devrez effectuer une conversion en caractères multi-octets. Heureusement, il existe une version de CString qui le fait automatiquement.

CString unicodestr = _T("Testing");
CStringA charstr(unicodestr);
DoMyStuff((const char *) charstr);

1 votes

Lorsque je l'utilise, j'obtiens cette erreur : "Error 2 error C2440 : 'initializing' : cannot convert from 'CString' to 'ATL::CStringT<BaseType,StringTraits>'". "

1 votes

@Attilah : Merci de l'avoir remarqué, j'avais une mauvaise syntaxe. C'est corrigé.

17voto

RichieHindle Points 98544

Note : Cette réponse est antérieure à l'exigence d'Unicode ; voir les commentaires.

Il suffit de le lancer :

CString s;
const TCHAR* x = (LPCTSTR) s;

Cela fonctionne parce que CString possède un opérateur cast pour faire exactement cela.

L'utilisation de TCHAR rend votre code indépendant de l'Unicode ; si vous n'êtes pas concerné par l'Unicode vous pouvez simplement utiliser char au lieu de TCHAR .

1 votes

Lorsque j'essaie votre méthode, j'obtiens cette erreur : "Error 1 error C2664 : 'CppSQLite3DB::execDML' : cannot convert parameter 1 from 'const TCHAR'. Les paramètres de mon projet utilisent Unicode mais la fonction CppSQLite3DB::execDML nécessite un const char. paramètre.

0 votes

Comme le dit Mark, vous devez convertir une chaîne CString Unicode en une chaîne CStringA ANSI : CStringA charstr(unicodestr) ; Vous pouvez ensuite convertir la chaîne CStringA en un const char*.

5voto

Reed Copsey Points 315315

Il y a un cast explicite sur CString vers LPCTSTR, donc vous pouvez le faire (à condition que l'unicode ne soit pas spécifié) :

CString str;
// ....
const char* cstr = (LPCTSTR)str;

0 votes

J'ai reçu le message d'erreur suivant : error C2440 : 'type cast' : cannot convert from 'CString' to 'LPCSTR'.

2 votes

Cette réponse est correcte pour la CString ANSI. Dans le cas de CString Unicode, voir la réponse acceptée.

2voto

Mr.What Points 11

J'ai eu un problème similaire. J'avais un char* avec le nom du fichier .so.
Je n'ai pas pu convertir le char* à la variable LPCTSTR . Voici comment je l'ai contourné...

char *fNam;
...
LPCSTR nam = fNam;
dll = LoadLibraryA(nam);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X