将 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注意:这个答案早于 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*的主要内容,如果未能解决你的问题,请参考以下文章
VS2008 C++中 inet_addr()函数用法。 inet_addr: 不能将参数 1 从“CString”转换为“const char *”
VS2017出现不存在从"CString"到"const char*"的适当转换函数