通过Windows API来了解多字节与宽字符
来源:互联网 发布:mac远程连接云服务器 编辑:程序博客网 时间:2024/05/20 23:03
多字节
ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是 255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。
这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字符显然不够用。于是便有了Unicode宽字节
宽字节
Unicode也是一种字符编码方法,它占用两个字节(0000H—FFFFH),容纳65536个字符,这完全可以容纳全世界所有语言文字的编码。
在Unicode里,所有的字符被一视同仁,汉字不再使用“两个扩展ASCII”(多字节名字的由来),而是使用“1个Unicode”,也就是说,所有的文字都按一个字符来处理,它们都有一个唯一的Unicode码。
Windows的版本来看多字节与宽字符
Windows NT与Windows 9x是两个内核完全不同的操作系统,Windows NT中的字符是UNICODE,而Windows 9x中的字符是ANSI;而后期的Windows 2000由于要把这两个系统都兼容,所以它也需要兼容这两种字符,而兼容的方法就是通过Windows API这一层来兼容这两个不同的内核系统。
Windows下所有有字符串作为参数的API都会有两个版本,一个是ANSI字符串版本,另外一个是UNICODE字符串版本。比如:Windows API的CreateFile相对应的两个版本分别为CreateFileA(ANSI版)和CreateFileW(Wide Chartacter宽字节UNICODE),有Kernel32导出这两个函数,而CreateFile仅仅是个宏定义:
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif
这种利用宏定义来区分的方式相当的便捷,动态链接库中的导入与导出也是由宏来控制
调用的过程可由下图来表示:
Windows2000/XP的系统下,由于内核支持的字符是UNICODE,所以如果接口是调用CreateFileW,则可直接调用内核,而如果是CreateFileA,则会在这个接口中先调用多字节转化为宽字符的函数MultiByteToUnicode,然后再调用CreateFileW来调用内核;Windows 9x由于内核支持的字符是ANSI,所以刚好相反。
资料主要来源------------------------------------程序员的自我修养(链接、装载与库)
- 通过Windows API来了解多字节与宽字符
- <Win32 API> 多字节字符与宽字符 WideCharToMultiByte/MultiByteToWideChar
- 《Windows API》多字节字符串转宽字符
- 宽字符与多字节字符
- 多字节字符与宽字节字符
- 多字节字符与宽字节字符
- 多字节与宽字符相互转换
- Windows中两种多字符与宽字符的转换方法
- linux 宽字符与多字节字符之间的转换
- C语言中的宽字符与多字节字符
- C语言中的宽字符与多字节字符[转]
- C/C++多字节字符与宽字符的输出
- C语言中的宽字符与多字节字符
- 什么是C语言中的宽字符与多字节字符
- vs 2010 多字节字符与宽字符的转化
- 什么是C语言中的宽字符与多字节字符
- 多字节字符与宽字符重新认识
- C++多字节字符与宽字节字符相互转换
- 2013年01月06日 工作总结
- linux 2.6 porting guide
- Visual Studio 调试时代码错位问题
- How to install JDK on Linux
- Hadoop学习总结Map-Reduce的过程解析
- 通过Windows API来了解多字节与宽字符
- 设计模式(十二)----- 代理模式(Proxy)----(JAVA版)
- 启动JBoss出现“java.lang.RuntimeException: java.lang.reflect.InvocationTargetException”解决
- Android eclipse中程序调试
- 小游戏系列算法之二贪吃蛇算法原理
- spring @Transactional相关说明
- Windows下OpenGL轻松加载BMP, GIF, JPEG, PNG, and TIFF图片
- Android SurfaceView Double Buffer
- 【Struts2】Annotation使用小记