ANSI(MBCS)和UNICODE的前世今生 ANSI是最先采用的字符集,以1Byte表示一个字符,后来为了表示含有音标的字母而产生了变种系列。但是这种字符集最大的问题是,无法表示诸如汉字、日本这样的“大字符” 于是,当初设计ANSI的那批人(瞎猜的,出错勿怪)很天才的设计了一种新的字符集,即后来的MBCS(MBCS中最常用也最常见的是DBCS)。MBCS利用1Byte表示原有的那些字符,并利用2Bytes或更高来表示大字符,于是乎,就可以解决原先的问题了。
但是,这个看似高明的方法并不高明。因为某些字符是1Byte,而某些则是2Bytes或更高。程序员在遍历字符串的时候,必须检查下一个字节,才知道正在处理的是小字符还是大字符。这对程序员和项目经理来说,无疑是一场噩梦。 内牛满面的科学家通过不断的猜想,建模,设计,最终设计产生了目前最广泛使用的UNICODE字符集。
标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。 (Unicode字符集有多种编码形式)例如“连通”两个字的Unicode标准编码UTF-16
(big endian)为:DE 8F 1A 90而其UTF-8编码为:E8 BF 9E E9 80 9A。
_T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变。因此,Visual C++里边定义字符串的时候,用_T来保证兼容性。VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候,程序不需要修改。
三、TEXT,_TEXT 和_T 一样的
如下面三语句:
1,用THCAR,LPTSTR,LPCTSTR等tchar数据类型的时候
2,用_tprintf之类的_t版本运行时函数时候
3,像下面这样有w和a版本的api,调用CreateFile的时候
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。
在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。
可以用WideCharToMultiByte和WideCharToMultiByte来进行char和wchar之间的转换,懒得再贴了,具体见: