关于Unicode和多字符集[MultiByte](ANSI)

 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);

 

第二种方法:通过引入头文件,利用强制转换W2A()和A2W()进行转换

代码如下:

#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;//内存以双字符结尾,单字符结尾并不是

 

你可能感兴趣的:(C++,MFC)