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

4 篇文章 0 订阅

 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时必须包含<tchar.h>,使用这种类型具有可移植性(两种编码都可使用)

 

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

 

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

代码如下:

#include<AtlBase.h>//第二种方法转换

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类<comutil.h>文件可实现转换

代码如下:

_bstr_t bstr = "dd";//_bstr_t类<comutil.h>可以随时存入和取出两种字符串;一般在MFC工程下使用。

bstr += "中国";

char* p = bstr;

wchar_t* p2 = bstr;//内存以双字符结尾,单字符结尾并不是

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值