Преобразование CString в const char *

Как мне преобразовать CString в const char* в моем приложении Unicode MFC?


person Attilah    schedule 13.05.2009    source источник
comment
Тот факт, что вы создаете программу Unicode, является КЛЮЧОМ к этой проблеме - ПОЖАЛУЙСТА, добавьте эту информацию к вопросу. (или кто-то с репутацией это сделает?)   -  person Aardvark    schedule 13.05.2009


Ответы (8)


Чтобы преобразовать TCHAR CString в ASCII, используйте макрос CT2A - это также позволит вам преобразовать строку в UTF8 (или любую другую кодовую страницу 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);

Существует также макрос для преобразования из ASCII -> Unicode (CA2T), и вы можете использовать его в приложениях ATL / WTL, если у вас есть VS2003 или выше.

Дополнительную информацию см. В MSDN.

person Rob    schedule 13.05.2009
comment
Я уже получил ответ на вопрос чуть раньше, и вы правы, я использовал макрос CT2A. Спасибо. - person Attilah; 14.05.2009
comment
Вы также можете сделать TRACE (_T (ASCII:% S \ n), CT2A (str) .m_psz); - person ajs410; 08.10.2011
comment
CA2T не конвертируется в Юникод. Он преобразуется в TCHAR, который может представлять или не представлять символы Юникода. CA2[C]W - это макрос, который преобразуется в Unicode. - person IInspectable; 23.12.2012
comment
Строка CT2A ascii(str, CP_UTF8); решила проблему, о которой я сообщил в комментариях к stackoverflow.com/a/5551013/383779. Спасибо. - person sergiol; 06.12.2016
comment
Кстати, ни один из объектов с именем ascii на самом деле не является строкой в ​​кодировке ASCII. Это узкие строки символов, использующие кодировку ANSI, UTF-8 и ANSI (в указанном порядке). - person IInspectable; 21.02.2017

Если ваш CString - Unicode, вам необходимо выполнить преобразование в многобайтовые символы. К счастью, есть версия CString, которая сделает это автоматически.

CString unicodestr = _T("Testing");
CStringA charstr(unicodestr);
DoMyStuff((const char *) charstr);
person Mark Ransom    schedule 13.05.2009
comment
когда я использую это, я получаю эту ошибку: Ошибка 2, ошибка C2440: «инициализация»: невозможно преобразовать из «CString» в «ATL :: CStringT‹ BaseType, StringTraits ›» - person Attilah; 13.05.2009
comment
@Attilah: Спасибо, что уловили это, у меня был неправильный синтаксис. Фиксированный. - person Mark Ransom; 13.05.2009

Примечание. Этот ответ предшествует требованию Unicode; см. комментарии.

Просто примените это:

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

Это работает, потому что в CString есть оператор приведения для этого.

Использование TCHAR делает ваш код независимым от Unicode; если вас не волнует Unicode, вы можете просто использовать char вместо TCHAR.

person RichieHindle    schedule 13.05.2009
comment
когда я пробую ваш метод, я получаю эту ошибку: Ошибка 1 ошибка C2664: «CppSQLite3DB :: execDML»: невозможно преобразовать параметр 1 из «const TCHAR » в «const char *». в моих настройках projetc используется Unicode, но для функции CppSQLite3DB :: execDML требуется параметр const char. - person Attilah; 13.05.2009
comment
Как говорит Марк, вам нужно преобразовать из Unicode CString в ANSI CStringA: CStringA charstr (unicodestr); Затем вы можете преобразовать CStringA в const char * - person RichieHindle; 13.05.2009

Существует явное приведение CString к LPCTSTR, поэтому вы можете сделать это (при условии, что unicode не указан):

CString str;
// ....
const char* cstr = (LPCTSTR)str;
person Reed Copsey    schedule 13.05.2009
comment
Я получил это сообщение об ошибке: ошибка C2440: «приведение типа»: невозможно преобразовать из «CString» в «LPCSTR» - person someone_ smiley; 25.03.2013
comment
Этот ответ верен для ANSI CString. В случае Unicode CString см. Принятый ответ. - person amolbk; 03.02.2015

У меня была аналогичная проблема. У меня был буфер char* с именем .so в нем.
Я не мог преобразовать переменную char* в LPCTSTR. Вот как я это обошел ...

char *fNam;
...
LPCSTR nam = fNam;
dll = LoadLibraryA(nam);
person Mr.What    schedule 22.09.2010

Я рекомендую вам использовать TtoC из ConvUnicode.h

const CString word= "hello";
const char* myFile = TtoC(path.GetString());

Это макрос для преобразования в Unicode

person felixjimcal    schedule 12.04.2017

Общие макросы преобразования (важен раздел TN059 «Прочие соображения»):

A2CW     (LPCSTR)  -> (LPCWSTR)  
A2W      (LPCSTR)  -> (LPWSTR)  
W2CA     (LPCWSTR) -> (LPCSTR)  
W2A      (LPCWSTR) -> (LPSTR) 
person Amit G.    schedule 17.07.2018

Я использовал это преобразование:

CString cs = "TEST";
char* c = cs.GetBuffer(m_ncs me.GetLength())

Надеюсь, это будет полезно.

person afs_mp    schedule 24.02.2021