Unicode的来龙去脉

什么是Unicode
和Unicode对应的概念是ASCII码。因为PC是美国人创造的,他们是说E文的,所以一个字节代码(256个)就能够表示他们语言中的所有字符,包括字母和各种标点符号等。后来,美国人的软件产品要卖给世界各地的人们,包括远东的中、日、韩。这些国家的文字很复杂,256个代码肯定表示不了那么多字符,于是有人提出了宽字符概念(DBCS),即用两个字节来表示文字。两个字节可以表示65000个字符,这样,世界上所有国家的文字都可以在成为这个字符集的子集,这就是所谓的Unicode了,“Unicode”的意思大概就是“通用(Uni)字符代码(Code)”的意思吧。
ANSI C对Unicode的支持
ANSI C对String.h文件进行了修改,声明了一个数据类型:
typedef unsigned short wchar_t;
以wchar_t代替老C中char的作用。
­
同时,ANSI C对所有设计字符串(包括参数和返回值用到字符串)的函数增加了宽字符版本,例如:
char * strcat(char *,const char *)增加了如下函数:
wchar_t * wcscat(wchar_t *,const wchar_t *)。
规律是所有函数名中的str替换为wcs,wcs是英文宽字符串的缩写,所有char换成wchar_t。
编写ANSI/Unicode通用代码
如果希望自己的程序很方便地在ANSI和Unicode编译方式中转换,办法是包含TChar.h头文件,并且使用TCHAR来代替wchar_t和char。当你define了_UNICODE时候,TCHAR将被解释为wchar_t;否则TCHAR将为解释为char。内部运行机制应该是这样:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#ifndef  _UNICODE
typedef char TCHAR;
可惜的是,ANSI C好像没有给字符串相关函数提供通用的表示方法,这个问题在Windows API中得到了很好的解决。
Windows API对Unicode的完美支持
Windows 头文件也定义了ANSI/Unicode通用数据类型PTSTR和PCTSTR。当定义了UNICODE时候,这些数据类型被解释为Unicode字符集,否则被解释为ANSI字符集。
为兼容性起见,Windows API为每个字符串函数定义了两种版本,即UNICODE版和ANSI版,前者函数名后有“W”,后者函数名后有“A”,例如CreateWindowExW和CreateWiondowExA。Windows头文件还定义了ANSI/Unicode通用的字符串函数。例如,CreateWindowEx。当定义了UNICODE时,CreateWindowEx接受Unicode字符串,否则他接受ANSI字符串。以下代码解释了其机理:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW  //解释成宽字符版函数
#else
#define CreateWindowEx CreateWindowExA  //解释成ANSI版函数
#endif
编写符合ANSI和Unicode的Windows程序
即使你不打算立即使用Unicode,最好也因该着手将你的应用程序转换成符合Unicode的应用程序。下面是应该遵循的一些基本规则:
将文本串视为字符数组,而不是chars数组或字节数组;
将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串;
将显示数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存;
将TEXT宏用于原义字符和字符串;
执行全局替换(例如将PTSTR替换PSTR);
修改字符串运算问题。即,使用sizeof(szBuffer)/sizeof(TCHAR)而不是sizeof(szBuffer)。还有应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值