UNICODE与多字符集[MultiByte](ANSI):是两种文字编码方式。
多字符集:各国文字的编码之间有些重叠的编码(编码冲突)
UNICODE:各国编码统一编码如果使用了这种编码,无论中文还是英文都占两个字节
wchar_t是属于双字节变量;
UNICODE的字符串常量必须在前面加一个大写L;
TCHAR类型是两种编码格式的自适应类型;
当VS项目设置为多字符集时,TCHAR被系统定义为char类型
当VS项目设置为Unicode时,TCHAR被系统定义为wchar_t类型
当VS项目设置为Unicode时,_TEXT(x)被系统定义为L(x)Unicode类型常量。
当VS项目设置为多字符集时,_TEXT(x)被系统定义为x多字符集类型常量。
使用_T或_TEXT时必须包含
Unicode的优点在于,无论在哪个国家的操作系统中,各国文字都无障碍地被展示出来;
早期的多字符集编码,经常是在各国操作系统内出现别国文字的乱码;
Windows操作系统每个API都提供了两套接口;
第一套xxA(…)带入传统的多字节符集文字;
第二套xxB(…) 带入的是UNICODE文字;
代码如下:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
当VS项目设置为多字节符集时所有的API都自动调用A接口
当VS项目设置为Unicode时所有的API都自动调用W接口
那么关于如何解决Unicode和非Unicode之间的转换问题呢?
第一种方法:通过MultiByteToWideChar()函数,由非Unicode转换成Unicode编码格式;通过WideCharToMultiByte()函数,由Unicode转换为非Unicode编码格式。
代码如下:
const char* p2 = "中国";//0xd6d0 Oxfab9
/*第一种方法转换*/
wchar_t t[20];//0x4e2d //0x56fd
//非Unicode转换成Unicode编码
MultiByteToWideChar(CP_ACP, 0, p2, -1,t, _countof(t));//第一个参数:获取系统的当前编码,第四个参数-1代表全部匹配,最后一个参数代表转换到的容器长度
//Unicode转换成非Unicode编码
char t2[20]; // 0xd6d0 Oxfab9
WideCharToMultiByte(CP_ACP,0, t,-1,t2, _countof(t2),NULL,NULL);
第二种方法:通过引入头文件
代码如下:
#include//第二种方法转换
const char* p1 = "abc";//Ox61 62 63
const wchar_t* s1 = L"abc";
char* t2 = W2A(s1);//Unicode转换成非Unicode编码
wchar_t* pw = A2W(p1);//非Unicode转换成Unicode编码
第三种方法:通过_bstr_t类
代码如下:
_bstr_t bstr = "dd";//_bstr_t类可以随时存入和取出两种字符串;一般在MFC工程下使用。
bstr += "中国";
char* p = bstr;
wchar_t* p2 = bstr;//内存以双字符结尾,单字符结尾并不是