通过Windows API来了解多字节与宽字符

来源:互联网 发布:mac远程连接云服务器 编辑:程序博客网 时间:2024/05/20 23:03

多字节

ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是 25500H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。

这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字符显然不够用。于是便有了Unicode宽字节

宽字节

Unicode也是一种字符编码方法,它占用两个字节(0000H—FFFFH,容纳65536个字符,这完全可以容纳全世界所有语言文字的编码。

Unicode里,所有的字符被一视同仁,汉字不再使用两个扩展ASCII”(多字节名字的由来),而是使用“1Unicode”,也就是说,所有的文字都按一个字符来处理,它们都有一个唯一的Unicode码。

Windows的版本来看多字节与宽字符

       Windows NTWindows 9x是两个内核完全不同的操作系统,Windows NT中的字符是UNICODE,而Windows 9x中的字符是ANSI;而后期的Windows 2000由于要把这两个系统都兼容,所以它也需要兼容这两种字符,而兼容的方法就是通过Windows API这一层来兼容这两个不同的内核系统。

       Windows下所有有字符串作为参数的API都会有两个版本,一个是ANSI字符串版本,另外一个是UNICODE字符串版本。比如:Windows APICreateFile相对应的两个版本分别为CreateFileAANSI版)和CreateFileWWide Chartacter宽字节UNICODE),有Kernel32导出这两个函数,而CreateFile仅仅是个宏定义:

#ifdef UNICODE

#define CreateFile CreateFileW

#else

#define CreateFile CreateFileA

#endif

这种利用宏定义来区分的方式相当的便捷,动态链接库中的导入与导出也是由宏来控制

调用的过程可由下图来表示:

Windows2000/XP的系统下,由于内核支持的字符是UNICODE,所以如果接口是调用CreateFileW,则可直接调用内核,而如果是CreateFileA,则会在这个接口中先调用多字节转化为宽字符的函数MultiByteToUnicode,然后再调用CreateFileW来调用内核;Windows 9x由于内核支持的字符是ANSI,所以刚好相反。

 

资料主要来源------------------------------------程序员的自我修养(链接、装载与库)

原创粉丝点击