三种编码方式,分别是:
1、SBCS(single byte character set)
2、MBCS(multi-byte characterset)
3、Unicode
SBCS是一个字节一个字符,MBCS是几个字节一个字符,可能是一个,两个,三个不等,但是实际上,绝大多数时候使用两个字节的,所以有时候看到DBCS(double-byte character set)代替MBCS也不奇怪;Unicode一律是两个字节编码。在windows nt内核中,API一律使用的是unicode编码,所以如果你在编写软件过程中使用非unicode编码方式,系统也会自动转换成unicode执行,然后返回的结构再转换为你使用的类型。单字节表示用char,unicode使用wchar_t.我们是在单字节的光芒下成长起来的,一时间完全抛弃单字节未免难以接受,但是有些时候我们又不可避免的需要使用unicode字符集合,那么ms提供的解决办法是用宏:TChar
我们看看他的定义:
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
ok,一切问题都解决了,我们只需要定义UNICODE就一样使用wchar_t,是很方便。另外,在windows的COM中使用的一律是unicode,但是MFC默认的确实MBCS,所以你用MFC写的类库如果放到了COM下,有些字符的格式化方式或者返回值错误的,原因就是com一律使用unicode,而unicode使用wchar_t('00')结尾,char却是使用'0'结尾的。一般情况下,普通字符需要加载_T宏才能正常运行,比如MFC中你写道S = "FSDFSDF",那么该类转到COM下,需要写S = _T("FSDFSDF");才可以。我们可以想象宏_T跟TCHAr的功能一样,如果使用UNICODE就自动在constant string前面加上L,否则就直接使用。
以后使用C++编写程序,如果出现乱码,首先检查C++的编码类型,而且一般情况下都是结束符号没有弄对,SBCS和MBCS都是以单字节0结尾,UNICODE是以双字节00结尾的。