相信对很多初接触的人来说,这两者的转换是一个很头疼的问题。。
网上很多的一种说法是:
1 char * psz = "a string";
2 CString str;
3 str.Format(_T("%s"), psz);
2 CString str;
3 str.Format(_T("%s"), psz);
但是很可惜,试验之后发现这种方法是行不通的,我们设想的
"a string"
并没有出现,结果却是
"瑳楲杮"
看看这两者的十六进制串是什么:
0x61 'a'
0x20 ' '
0x73 's'
0x74 't'
0x72 'r'
0x69 'i'
0x6e 'n'
0x67 'g'
0x2061 L''
0x7473 L'瑳'
0x6972 L'楲'
0x676e L'杮'
0x20 ' '
0x73 's'
0x74 't'
0x72 'r'
0x69 'i'
0x6e 'n'
0x67 'g'
0x2061 L''
0x7473 L'瑳'
0x6972 L'楲'
0x676e L'杮'
这下很明显了,CString.Format把psz的每两个char当作一个wchar进行了转换,结果是一串乱码。
那么正确的方法是什么呢?
其实,CString的构造函数就为我们提供了这样的途径:
1 char * psz = "a string";
2 CString str(psz);
2 CString str(psz);
OK,我们得到了想要的结果:
"a string"
自然而然地,一个问题出现了:如果我们的代码中,没有办法在声明CString的时候就进行初始化,而需要稍后赋值,该怎么办?
事实上,最简单但是无脑的办法是:
1 char * psz = "a string";
2 CString str;
3 str = psz;
2 CString str;
3 str = psz;
事情就是这样——最简单的办法,往往是最有效的……
这样的做法,工作都是CString替我们做的,暂且不说真正理解与否,写成这样,自己看起来怎么总有点那么别扭与不爽= =![]()
为了视觉上与心理上舒服那么一些,我们就让简单的事情变复杂一些吧!
1 char * psz = "a string";
2 CString str;
3 str = CA2T((LPCSTR)psz);
2 CString str;
3 str = CA2T((LPCSTR)psz);
盗用孙猴子的一句话:“这下 大家 满足了吧~”
CA2T经过层层#define和typedef,最后抵达一个叫做
class CA2WEX
{
...
}
{
...
}
的东西,其实里面也是通过
来实现的,只是我对长串参数的函数有偏见...
PS:以上工作是在VS2008中进行的,如果是VC6应该用"A2T"而不是"CA2T"
