将 CString 转换为 const char*

Posted

技术标签:

【中文标题】将 CString 转换为 const char*【英文标题】:Convert CString to const char* 【发布时间】:2009-05-13 17:31:34 【问题描述】:

如何在我的 Unicode MFC 应用程序中从 CString 转换为 const char*

【问题讨论】:

您正在构建一个 unicode 程序这一事实是这个问题的关键 - 请将此信息添加到问题中。 (或者有代表的人这样做?) 【参考方案1】:

要将 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) 转换,只要你有 VS2003 或更高版本,你就可以在 ATL/WTL 应用程序中使用这些宏。

请参阅MSDN 了解更多信息。

【讨论】:

我之前已经得到了问题的答案,你说得对,我使用了 CT2A 宏。谢谢。 你也可以做 TRACE(_T("ASCII: %S\n"), CT2A(str).m_psz); CA2T 不会转换为 Unicode。它转换为TCHAR,它可能代表也可能不代表Unicode 字符。 CA2[C]W 是转换为 Unicode 的宏。 CT2A ascii(str, CP_UTF8); 行解决了我在***.com/a/5551013/383779 的 cmets 上报告的问题。谢谢。 顺便说一句,名为 ascii 的对象实际上都不是 ASCII 编码的字符串。它们是窄字符串,使用 ANSI、UTF-8 和 ANSI 编码(按此顺序)。【参考方案2】:

如果您的 CString 是 Unicode,则需要转换为多字节字符。幸运的是,有一个版本的 CString 可以自动执行此操作。

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

【讨论】:

当我使用这个时,我得到这个错误:“错误 2 错误 C2440:'正在初始化':无法从 'CString' 转换为 'ATL::CStringT'”“跨度> @Attilah:感谢您的理解,我的语法错误。固定。【参考方案3】:

注意:这个答案早于 Unicode 要求;见 cmets。

只要施放它:

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

之所以有效,是因为 CString 有一个强制转换运算符来执行此操作。

使用 TCHAR 使您的代码独立于 Unicode;如果您不关心 Unicode,您可以简单地使用 char 而不是 TCHAR

【讨论】:

当我尝试您的方法时,我收到此错误:“错误 1 ​​错误 C2664:'CppSQLite3DB::execDML':无法将参数 1 从 'const TCHAR ' 转换为 'const char *' ”。我的 projetc 设置使用 Unicode,但函数 CppSQLite3DB::execDML 需要一个 const char 参数。 正如 Mark 所说,您需要将 Unicode CString 转换为 ANSI CStringA: CStringA charstr(unicodestr);然后,您可以将 CStringA 转换为 const char*【参考方案4】:

CString 有一个显式转换为 LPCTSTR,所以你可以这样做(如果没有指定 unicode):

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

【讨论】:

我收到了这个错误信息:错误 C2440: 'type cast' : cannot convert from 'CString' to 'LPCSTR' 这个答案对于 ANSI CString 是正确的。如果是 Unicode CString,请参阅接受的答案。【参考方案5】:

我遇到了类似的问题。我有一个带有 .so 名称的 char* 缓冲区。 我无法将char* 变量转换为LPCTSTR。这是我解决它的方法...

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

【讨论】:

【参考方案6】:

我建议你使用来自 ConvUnicode.h 的 TtoC

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

这是一个宏,可以根据 Unicode 进行转换

【讨论】:

【参考方案7】:

通用转换宏(TN059 其他注意事项部分很重要):

A2CW     (LPCSTR)  -> (LPCWSTR)  
A2W      (LPCSTR)  -> (LPWSTR)  
W2CA     (LPCWSTR) -> (LPCSTR)  
W2A      (LPCWSTR) -> (LPSTR) 
TN059: Using MFC MBCS/Unicode Conversion Macros

【讨论】:

【参考方案8】:

我使用了这个转换:

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

我希望这是有用的。

【讨论】:

以上是关于将 CString 转换为 const char*的主要内容,如果未能解决你的问题,请参考以下文章

CString转换为const char*

VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”

CString 转化成 const char* 类型

VS2017出现不存在从"CString"到"const char*"的适当转换函数

c++中出现 无法从“CString”转换为“const std::string”错误

转换 (const char*) var 出错