没有合适的资源?快使用搜索试试~ 我知道了~
VC++的Unicode编程.doc
3星 · 超过75%的资源 需积分: 10 45 下载量 69 浏览量
2009-04-06
22:08:22
上传
评论
收藏 129KB DOC 举报
温馨提示
试读
11页
VC++的Unicode编程的详细方法: 使用Unicode编码可以使您的工程同时支持多种语言,使您的工程国际化。 另外,Windows NT是使用Unicode进行开发的,整个系统都是基于Unicode的。如果调用一个API函数并给它传递一个ANSI(ASCII字符集以及由此派生并兼容的字符集,如:GB2312,通常称为ANSI字符集)字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给您的应用程序。进行这些字符串的转换需要占用系统的时间和内存。如果用Unicode来开发应用程序,就能够使您的应用程序更加有效地运行。
资源推荐
资源详情
资源评论
一、什么是 Unicode
先从 ASCII 说起,ASCII 是用来表示英文字符的一种编码规范。每个 ASCII 字符占用 1
个字节,因此,ASCII 编码可以表示的最大字符数是 255(00H—FFH)。其实,英文字符
并没有那么多,一般只用前 128 个(00H—7FH,最高位为 0),其中包括了控制字符、数字、
大小写字母和其它一些符号。而最高位为 1 的另 128 个字符(80H—FFH)被称为“扩展
ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。
这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文
字,255 个字符显然不够用。
于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312
—80”,它是和 ASCII 兼容的一种编码规范,其实就是利用扩展 ASCII 没有真正标准化这一点,
把一个中文字符用两个扩展 ASCII 字符来表示,以区分 ASCII 码部分。
但是这个方法有问题,最大的问题就是中文的文字编码和扩展 ASCII 码有重叠。而很多软
件利用扩展 ASCII 码的英文制表符来画表格,这样的软件用到中文系统中,这些表格就会被误
认作中文字符,出现乱码。
另外,由于各国和各地区都有自己的文字编码规则,它们互相冲突,这给各国和各地区交
换信息带来了很大的麻烦。
要真正解决这个问题,不能从扩展 ASCII 的角度入手,而必须有一个全新的编码系统,这
个系统要可以将中文、法文、德文……等等所有的文字统一起来考虑,为每一个文字都分配一
个单独的编码。
于是,Unicode 诞生了。
Unicode 也是一种字符编码方法,它占用两个字节(0000H—FFFFH),容纳 65536 个
字符,这完全可以容纳全世界所有语言文字的编码。
在 Unicode 里,所有的字符被一视同仁,汉字不再使用“两个扩展 ASCII”,而是使用“1
个 Unicode”,也就是说,所有的文字都按一个字符来处理,它们都有一个唯一的 Unicode 码。
二、使用 Unicode 编码的好处
使用 Unicode 编码可以使您的工程同时支持多种语言,使您的工程国际化。
另外,Windows NT 是使用 Unicode 进行开发的,整个系统都是基于 Unicode 的。如
果调用一个 API 函数并给它传递一个 ANSI(ASCII 字符集以及由此派生并兼容的字符集,如:
GB2312,通常称为 ANSI 字符集)字符串,那么系统首先要将字符串转换成 Unicode,然
后将 Unicode 字符串传递给操作系统。如果希望函数返回 ANSI 字符串,系统就会首先将
Unicode 字符串转换成 ANSI 字符串,然后将结果返回给您的应用程序。进行这些字符串的转
换需要占用系统的时间和内存。如果用 Unicode 来开发应用程序,就能够使您的应用程序更
加有效地运行。
下面例举几个字符的编码以简单演示 ANSI 和 Unicode 的区别:
字符
和
码
码
三、使用 C++进行 Unicode 编程
对宽字符的支持其实是 ANSI C 标准的一部分,用以支持多字节表示一个字符。宽字符和
Unicode 并不完全等同,Unicode 只是宽字符的一种编码方式。
1、宽字符的定义
在 ANSI 中,一个字符(char)的长度为一个字节(Byte)。使用 Unicode 时,一个字
符占据一个字,C++在 wchar.h 头文件中定义了最基本的宽字符类型 wchar_t:
从这里我们可以清楚地看到,所谓的宽字符就是无符号短整数。
2、常量宽字符串
对 C++程序员而言,构造字符串常量是一项经常性的工作。那么,如何构造宽字符字符
串常量呢?很简单,只要在字符串常量前加上一个大写的 L 就可以了,比如:
!"#$%%$
这个 L 非常重要,只有带上它,编译器才知道你要将字符串存成一个字符一个字。还要注
意,在 L 和字符串之间不能有空格。
3、宽字符串库函数
为了操作宽字符串,C++专门定义了一套函数,比如求宽字符串长度的函数是
&%%'!(
为什么要专门定义这些函数呢?最根本的原因是,ANSI 下的字符串都是以’’来标识字符串
尾的(Unicode 字符串以“”结束),许多字符串函数的正确操作均是以此为基础进行。而我们
知道,在宽字符的情况下,一个字符在内存中要占据一个字的空间,这就会使操作 ANSI 字符
的字符串函数无法正确操作。以”Hello”字符串为例,在宽字符下,它的五个字符是:
0x0048 0x0065 0x006c 0x006c 0x006f
在内存中,实际的排列是:
))))
于是,ANSI 字符串函数,如 strlen,在碰到第一个 48 后的 00 时,就会认为字符串到尾
了,用 strlen 对宽字符串求长度的结果就永远会是 1!
4、用宏实现对 ANSI 和 Unicode 通用的编程
可见,C++有一整套的数据类型和函数实现 Unicode 编程,也就是说,您完全可以使用
C++实现 Unicode 编程。
如果我们想要我们的程序有两个版本:ANSI 版本和 Unicode 版本。当然,编写两套代码
分别实现 ANSI 版本和 Unicode 版本完全是行得通的。但是,针对 ANSI 字符和 Unicode 字
符维护两套代码是非常麻烦的事情。为了减轻编程的负担,C++定义了一系列的宏,帮助您实
现对 ANSI 和 Unicode 的通用编程。
C++宏实现 ANSI 和 Unicode 的通用编程的本质是根据”_UNICODE”(注意,有下划
线)定义与否,这些宏展开为 ANSI 或 Unicode 字符(字符串)。
如下是 tchar.h 头文件中部分代码摘抄:
剩余10页未读,继续阅读
资源评论
- wushangjimo2012-07-25写的很多,就是太繁琐了,还是java简单,一句话搞定
yuanliping518518
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功