API入门系列之Unicode还是ASCII
不知道各位新手朋友们遇到这样的问题没有呢,新建一个Windows应用程序,调用MessageBox这个函数,预备让它弹出一段提示文本,可是编译器在编译的时候却报错说,不能将const char* 或者const char[] 转换为const wchar_t* 之类的提示呢,许多刚接触Windows API 编程的朋友们在这里可能就卡住了,不知如何下手解决了,其实,这就是Unicode编码和ASCII编码的问题了。我下面就会一一道来
关于Unicode和ASCII详细的编码是怎么的,我这里就不具体介绍了,也介绍不了,假如需要深入了解,网上有许多这方面的特地文章,我这里就只对Unicode编码和ASCII编码在Windows平台下的编程相关的内容进展介绍。
我们都知道Unicode和ASCII的区分就是Unicode采纳2个字节来存储一个字符,不管是英文,汉字,还是其他国家的文字,都有能用2个字节来进展编码,而ASCII采纳一个字节存储一个字符,所以对于英文的编码,那是足够的了,可是对于汉字的编码,则必需采纳一些特别的方法,用2个ASCII字符来表示一个汉字。
我们在写程序的过程中,势必要和字符打交道,要输入,猎取,显示字符,究竟是选用Unicode字符呢还是ASCII字符呢,这都是各位自己的权利。但为了程序的通用性和符合目前操作系统的主流趋势,Unicode编
码是被推举的。由于Unicode字符要比ASCII字符占用的空间大一倍,编译出来的程序在体积上和占用的内存上必定要大一些,不过这并不是什么很大的问题。所以微软目前的SDK中保存了2套API,一套用于采纳Unicode编码处理字符的程序的编写,一套用于采纳ASCII编码处理字符的程序的编写。例如,我们上面提到的MessageBox,它其实不是一个函数名,而是一个宏定义,我们先来看看它是怎么被定义的,再来争论它。
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
看到了吗? 很简洁是不是, 假如定义了UNICODE 这个宏那么就定义MessageBox为MessageBoxW,假如没有定义UNICODE这个宏,那么就定义MessageBox 为MessageBoxA,MessageBox后面的W和A 就是代表宽字节(Unicode)和ASCII,这样,其实存在于SDK中的函数是MessageBoxW和MessageBoxA这两个函数.
MessageBox只是一个宏而已。所以在程序中,这3个名字你都可以使用,只不过需要留意的是,使用MessageBoxA的话,那么你要留意传给它的参数,字符都必需是单字节,也就是ASCII,在程序中就是char,假如使用MessageBoxW的话,那么,字符都必需使用Unicode,程序中就
是wchar_t。但是这样有个特别不便利的地方那就是,假如你使用W 后缀系列的函数的话,那么你的程序使用的字符就是Unicode字符编码的,但是假如你需要用这个程序的源代码编译出字符采纳ASCII编码的程序,那么需要改动的地方就太大了。但凡涉及到字符操作的地方都需要转变。那么,有没有比拟好的方法不做更改就可以用同样的代码编译出ASCII 版本的程序呢。
固然有,就是我们在编程的时候尽量使用不带后缀的宏定义,如上例,就使用MessageBox,其中的参数也不明确使用char 还是wchar_t 而是使用微软给我们定义的TCHAR字符数据类型,它的定义和上面MessageBox 函数的定义差不多,都是依据是否认义了UNICODE这个宏来推断是将TCHAR定义为char还是wchar_t,所以这样一来,这个TCHAR的数据类型就是可变的了,它依据工程的设置而定义为相应的最终字符类型,这样我们的程序就可以不做任何更改就可以轻松的编译出另外一个版本的了。是不是特别便利。
前面2篇文章纯文字的介绍比拟多,由于许多是概念性的,需要理解,后面的文章我预备协作一些小例如程序,使用一些简洁的API函数,遇到的相关的概念在一并介绍的方法进展。所以,前2篇文章假如
各位朋友不是很能理解,不用担忧,影响不是很大,经过后面的学习,你就会渐渐的理解前面所说的内容了。
unicode码和ascii码区别

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。