一个关于字符串的简单有关问题

一个关于字符串的简单问题
请问各位大侠请问_T( "字符串 "),这种类型的写法是什么含义,结果是什么类型的值,它与普通的CString类型的字符串有什么区别嘛?

------解决方案--------------------
_T的意思如下:

在Windows操作系统中,以现在的版本来讲,Windows2000和WindowXP都是用Unicode字符的,也就是说一个字符占2个字节,而原来的Window98是用ASCII字符的,也就是一个字符占一个字节。

这样在编程的时候就会遇到字符串转换的问题。

_T是一个宏定义,用来在Unicode字符编码的时候,将你输入的字符串当作Unicode字符串,在ASCII字符编码的时候将你输入的字符串当作ASCII字符串。

TEXT()宏的另一个版本。实现宽字符。

转变成宽字符串。也就是Unicode字符
纠正一下。应该是转换成 MBCS。
比如:
TCHAR a[1] = _T( "a ");
在PC环境下面:内存是这样的:0x61 0x00
在WINCE环境下面:内存是这样的:0x00 0x61 0x00 0x00

实现Unicode字符,这样
如果 "Hello "用ASCII码,占用5个字符
_T( "Hello ")就占用10个字节,根据的是用了L "Hello! ";
我们平时编程是在ASCII码下编程,怎么在Unicode下编程呢
如何在UNICODE下编程呢,为工程添加UNICODE和_UNICODE预处理选项(有的还说去除_MBCS,我认为不除去也可以),在编译器中进行如下的设置
(1)VC.net中就是 项目 -> 属性 -> c/c++ -> 预处理器 在 "预处理定义 "中加入这两个宏定义
(2)vc6中 project -> settings -> c/c++ -> Preprocessor definitions
(3)引入TCHAR.h文件,好像不需要单独引入,windows.h中就自动引入了
(4)在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下
(5)在Project/Setting/link/output 中设置Entry为wWinMainCRTStartup(不设置好像也可以)


我们平时工作的环境是ASCII的,不是UNICODE的,比如我们调用MessageBox函数可以这样调用
MessageBox(NULL, "hello ", "caption ", MB_OK);,但在UNICODE下这样是不行的必须用MessageBox(NULL, L "hello ", L "caption ", MB_OK);为什么同样是MessageBox会有这样的不同呢,原来对MessageBox进行了如下的定义
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
其它的函数也进行了如此的宏定义。

------解决方案--------------------
一个VC程序理论上有三种版本来决定字符串如何处理。
ANSI/MBCS/UNICODE
ANSI:单字节字符
MBCS:多字节字符,一般用于中文、日语之类的东亚语种
本质上这两种没有太大区别。字符串以一个字节0结束。

UNICODE
所有字符可以按照UTF-16处理,也就是一个字符占两个字节。


ANSI/MBCS的字符串的形式为 "xxx "

UNICODE 的字符串的形式为L "xxx "

_T就是根据工程设置决定编译成那种形式。

与_T对应有一组函数_tcsxxxx

所有这些都定义在tchar.h中。

如果所有的字符串以及处理函数严格使用_t系列。就可以定义两套不同的工程设置,把同一套代码编译生成unicode版和ANSI/MBCS版。