关于Ansi和Unicode



ASCII编码(美国标准信息交换代码)是很早的一种编码,最早的ASCII使用7位表示一个字符,随着计算机在世界范围内的普及,ASCII不能满足人们的需要了,于是,人们开始了对ASCII的扩充之路。

例如,IBM公司将原本7位的ASCII扩充到8位,使其可以标识256个字符,但是这根本不能满足人们的需要,比如中国的文字,根本就不够用。

微软公司推出了一个当时不错的解决方案,那就是Ansi,微软提出了一个叫“代码页”的感念,Ansi在不同的代码页下标识的字符不同,例如,在大陆Ansi表示GBK,GB2312等编码,在台湾表示BIG5编码。用户只需要把系统的代码页(语言和区域设置)设置到自己国家的代码页,就可以很方便地使用自己国家文字的程序和文档了。

但是随着发展,代码页越来越多,国际交流原来越频繁,Ansi又不能满足人们的需要了。于是,Unicode诞生了。

Unicode是一种字符映射方案,是把每一个字符映射成几个字节,不同国家的字符,映射到不同的段中(例如中文映射到0x4E00 - 0x9FBF)因此Unicode有个形象的称呼叫做万国码,UTF-16和UTF-8等都是Unicode编码方式,但是在微软的文档中,Unicode就是指的UTF-16。

所以,Win32API涉及字符串的一般都提供了两个版本,Ansi版本和Unicode版本,这两个版本究竟谁优谁劣呢?

微软建议我们编程时一律使用Unicode编码,因为:
1。Windows内核都是采用的Unicode编码,如果我们使用Ansi,就意味着Windows必须被迫分配内存,在API函数内部转码,这回极大降低程序运行效率。
2。使用Ansi编码的程序在推广时会出问题,如果使用Ansi编码,就意味着程序只能在大陆推广,如果一个台湾的,外国的系统运行会乱码。(除非他把代码页手动调到中国大陆)而Unicode是没有这种问题的。

关于TCHAR,TEXT(),_T()宏
1。当没有定义_UNICODE宏时,TCHAR=char
当定义了_UNICODE宏时,TCHAR=wchar_t

2。 当没有定义_UNICODE宏时,TEXT(),_T()没有作用, 例如TEXT("ABC")="ABC"
当定义了_UNICODE宏时,TEXT(),_T()在字符串之前加L,例如TEXT("ABC")=L"ABC"

3。在SDK的头文件中,两个版本的API又定义了一个宏,如MessageBoxA和MessageBoxW,又定义了一个MessageBox宏,同理,这个宏受_UNICODE宏控制而代表不同的API

所以, TCHAR,TEXT(),_T()就是为了方便设置字符串版本的,受_UNICODE宏控制。

在VS集成开发环境中,_UNICODE宏设置方法为:

在工程的属性页中设置,“使用 Unicode 字符集”为定义_UNICODE宏,“未设置”表示不定义,即使用Ansi编码

在Microsoft C/C++编译器(控制台)中,有一个开关可以控制_UNICODE宏,可以通过cl /?查询

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值