windows程序设计基础(字符基础)
ps:欢迎各位大佬指正错误之处,欢迎交流学习,本人QQ:3311684596
正文:
本篇blog主要写给初入win32编程坑的人,相信很多第一次看win32编程的人都会被win32里面各种函数给看的一头雾水,这其中很大一部分要归功于Unicode和ASCII的功劳,众所周知计算机编码系统是不断发展的,windows的编码也是经过了ASCII(7位)到扩展ASCII(8位)再到双字节字符集(DBCS)然后到宽字符(Unicode)。(现在的windows以Unicode为主),这篇文章的关注重点就是Unicode,然后帮助初学者理清各种字符编码系统
先来简单介绍一下字符编码系统,最初的字符编码是来自于莫尔斯代码就那一堆小圆点和小破折号构成的字符串,然后接下来就是标准ASCII码,这主要是美国标准而且只有7位,八位的ASCII码是后来进行扩展的,扩展后还是无法满足多国语言文字的要求,就不说欧洲语言的重音符号,但是东亚的象形文字就不可能满足,所以这个时候出来了DBCS也就是俗称的双字节字符集。有人就问了这玩意和Unicode有什么区别呐。来来来,划重点了要考的就是Unicode每一个字符都是两个字节,但是DBCS这个草狗的玩意有的是字符是一个字节,有的字符是两个字节。那么问题就来了,对于DBCS如何编写字符串处理函数,连一个最简单的strlen()都要写的很复杂。所以DBCS就很少有人用了,至此,Unicode的王者地位就确定下来了。
上一段我们说到,windows字符编码系统Unicode的成长史,蛋碎之而来的就是新的问题,先来说一个宇宙人都知道的事实那就是标准c中,类型char是一个字节,但是,注意看但是,Unicode是双字节编码,也就是每一个字节是16位,也就是两个字节,这不就意味着以前的那些字符串函数不就不能用了嘛,这着实令人fuck,因此,windows重新定义了一些新类型。关键来了,这是win32编程必过的一道坎。typedef unsigned short wchar_t,大家都知道short两个字节,所以估计大家也猜到了,windows用short来储存Unicode字符的编码。举例来说wchar_t c=‘A’, 这时c的值为0x0041。然后windows把字符串也改了,举例wchar_t *p=L"Hello!",加了个大写的L,这个L可不能丢还定义很多其他的宏如_t(),TEXT()等等,其他的就太多了。想深入了解的可以百度windows宽字符宏。
windows宽字符最后一个重点就是有的人想把源码编译成Unicode和ASCII版本,你总不能把类型换了重写一次吧。windows给出的解决方法就是定义 UNICODE。这是很多windows标准头文件的写法。比如如下例
#ifdef UNICODE
typedef WCHAR TCHAR
#else
typedef char TCHAR
#endif
这是我简化的版本,但足够说明问题了,通过一个标识符UNICODE,来确定TCHAR的双重定义,到底是WCHAR还是char,编译器也可以通过这个标识符来编译源码为Unicode版本或ASCII版本,注意这种格式,windows很多头文件都采用这种格式,再举一个例子如
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
如果定义了UNICODE标识符,那MessageBox就是Unicode版本否则是ASCII版本。ps:MessageBox的W后缀代表wchar_t,A后缀代表ASCII
码字不易,纯属原创,转发注明出路。