经过查阅网上资料,发现TRACE宏只支持ANSI编码。在VS2010里面缺省字符编码为UNICODE,于是CString按双字节编码保存字符串。为保证TRACE输出正确,有两种解决途径:
(1)输出前由自己完成从UNICODE到ANSI的转换。
- 方法一:通过使用内部字符串为单字节的CStringA
CString strPath = _T("D:\\数据下载\\测试");
CStringA strA(strPath);
TRACE(strA);
- 方法二:
char szBuf[512];
memset(szBuf, 0, 512);
int nWideChar = strPath.GetLength();
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)strPath, nWideChar, szBuf, 512, NULL, NULL);
TRACE("%s", szBuf);
(2)配置地域化信息,由TRACE正确解码。
#include<locale.h>
setlocale(LC_ALL, "chs");
TRACE有3种格式:
1. TRACE1( "%s", str); // TRACE2
2. TRACE( "%S", str);
3. TRACE(L"%s", str);
以上考虑的是CString中含有中文的情况,对于只含英文字符的情况,不用地域化,仅使用格式2也可正确输出。