相信对很多初接触的人来说,这两者的转换是一个很头疼的问题。。

网上很多的一种说法是:  

1 char * psz = "a string";
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''

 

这下很明显了,CString.Format把psz的每两个char当作一个wchar进行了转换,结果是一串乱码。

 

那么正确的方法是什么呢?

其实,CString的构造函数就为我们提供了这样的途径:

 

1 char * psz = "a string";
2 CString str(psz);

  

OK,我们得到了想要的结果:

"a string"

 

自然而然地,一个问题出现了:如果我们的代码中,没有办法在声明CString的时候就进行初始化,而需要稍后赋值,该怎么办?

事实上,最简单但是无脑的办法是:

1 char * psz = "a string";
2 CString str;
3 str =
psz;

事情就是这样——最简单的办法,往往是最有效的……

 

这样的做法,工作都是CString替我们做的,暂且不说真正理解与否,写成这样,自己看起来怎么总有点那么别扭与不爽= =

为了视觉上与心理上舒服那么一些,我们就让简单的事情变复杂一些吧!

1 char * psz = "a string";
2 CString str;
3 str = CA2T((LPCSTR)
psz);

盗用孙猴子的一句话:“这下 大家 满足了吧~”

 

CA2T经过层层#define和typedef,最后抵达一个叫做

class CA2WEX
{

    ...
}

的东西,其实里面也是通过

Code

来实现的,只是我对长串参数的函数有偏见... 

 

PS:以上工作是在VS2008中进行的,如果是VC6应该用"A2T"而不是"CA2T"