2009-05-13 76 views
40

Làm cách nào để chuyển đổi từ CString sang const char* trong ứng dụng Unicode MFC của tôi?Chuyển đổi CString thành const char *

+3

Thực tế là bạn đang xây dựng một chương trình unicode là chìa khóa cho vấn đề này - XIN thêm thông tin này cho câu hỏi. (hoặc ai đó với đại diện làm điều đó?) – Aardvark

Trả lời

60

Để chuyển đổi một CString TCHAR để ASCII, sử dụng CT2A vĩ mô - điều này cũng sẽ cho phép bạn chuyển đổi các chuỗi UTF8 (hoặc bất kỳ trang mã Windows khác):

// 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); 

Ngoài ra còn có một macro để chuyển đổi từ ASCII -> Unicode (CA2T) và bạn có thể sử dụng chúng trong các ứng dụng ATL/WTL miễn là bạn có VS2003 trở lên.

Xem MSDN để biết thêm thông tin.

+0

Tôi đã nhận được câu trả lời cho câu hỏi này sớm hơn một chút và bạn đã đúng, tôi đã sử dụng macro CT2A. Cảm ơn bạn – Attilah

+0

Bạn cũng có thể làm TRACE (_T (" ASCII:% S \ n "), CT2A (str) .m_psz); – ajs410

+0

' CA2T' không ** không ** chuyển thành Unicode. Nó chuyển thành 'TCHAR' có thể hoặc không thể đại diện cho các ký tự Unicode.' CA2 [ C] W' là macro chuyển đổi thành Unicode – IInspectable

12

Lưu ý: Câu trả lời này đặt trước yêu cầu Unicode; xem nhận xét.

Chỉ cần cast nó:

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

Nó hoạt động vì CString có một nhà điều hành dàn diễn viên để thực hiện chính xác này.

Sử dụng TCHAR làm cho mã của bạn độc lập với Unicode; nếu bạn không quan tâm đến Unicode, bạn có thể chỉ cần sử dụng char thay vì TCHAR.

+0

khi tôi thử phương pháp của bạn, tôi nhận được lỗi này: "Lỗi lỗi C2664: 'CppSQLite3DB :: execDML': không thể chuyển đổi tham số 1 từ 'const TCHAR *' thành 'const char * '". cài đặt projetc của tôi sử dụng Unicode nhưng hàm CppSQLite3DB :: execDML yêu cầu tham số const char *. – Attilah

+0

Như Mark nói, bạn cần phải chuyển đổi từ một Unicode CString sang ANSI CStringA: CStringA charstr (unicodestr); Sau đó bạn có thể cast CStringA vào một const char * – RichieHindle

3

Có một diễn viên rõ ràng trên CString để LPCTSTR, vì vậy bạn có thể làm (unicode cung cấp không được quy định):

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

Tôi nhận được thông báo lỗi này: lỗi C2440: 'type cast': không thể chuyển đổi từ 'CString' sang 'LPCSTR' –

+0

Câu trả lời này là đúng cho ANSI CString. Trong trường hợp Unicode CString, xem câu trả lời được chấp nhận. – amolbk

18

Nếu CString của bạn là Unicode, bạn sẽ cần phải làm một chuyển đổi đa ký tự byte. May mắn thay có một phiên bản của CString sẽ tự động thực hiện điều này.

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

khi tôi sử dụng điều này, tôi nhận được lỗi này: "Lỗi lỗi C2440: 'khởi tạo': không thể chuyển đổi từ 'CString' thành 'ATL :: CStringT '" " – Attilah

+0

@Attilah: Cảm ơn –

1

Tôi gặp sự cố tương tự. Tôi đã có một bộ đệm char* với tên .so trong đó.
Tôi không thể chuyển đổi biến char* thành LPCTSTR. Đây là cách tôi đã xung quanh nó ...

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

tôi recommendo để bạn sử dụng TtoC từ ConvUnicode.h

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

Nó là một vĩ mô để làm chuyển đổi cho mỗi Unicode

Các vấn đề liên quan