Unicode字符串的MFC支持及其在Visual Studio中的设置

来源:互联网 发布:网络工具书有哪些 编辑:程序博客网 时间:2024/06/04 17:40

1. 问题及分析


最近在自己写的MFC程序时,编译总是碰到以下的类似的问题:

error C2664: 'BOOL CDC::TextOutW(int,int,const CString &)' : cannot convert parameter 3 from 'const char [13]' to 'const CString &'

类似的问题还有“MessageBoxW”的问题。


到出错的代码处转到定义后发现如下代码:

#ifdef UNICODE#define TextOut  TextOutW#else#define TextOut  TextOutA

可知是定义了UNICODE编码后,编译跳到了TextOutW,而我们本来想使用的是TextOutA。之前的解决方法是直接在代码中把TextOut强制性改为TextOutA来使用该函数(但是感觉这样指标不治本)。于是思量着VS的工程设置里应该有设置不使用UNICODE编码。


2. 解决方法及延伸

通过分析可知这是由于使用了UNICODE编码所产生的编译问题(如果你确实想使用UNICODE编码,请按照TextOutW的参数表来填写参数),通过以下的工程设置可以取消UNICODE编码:

Project-->Properties-->General-->Project Defaults-->Character Set,接着选择Use Unicode Character Set(使用Unicode字符集)之外的选项,如图:



可以看到使用Not Set或者Use Muti-Byte Character Set的选项,Not Set则是使用普通的ASCII码,后者为多字节字符集(MBCS),如果你的代码中有中文或者其他非英文类语言,建议还是使用MBCS或者UNICODE,因为ASCII码还不足以用来表示类似中文这样的多字节语言。


现在MFC也能很好地支持UNICODE与MBCS。其实在新建MFC工程的时候就能选择是否使用UNICODE:



有关UNICODE的与MBSC的支持可以查看相关MSDN:

http://msdn.microsoft.com/zh-cn/library/cc468203(v=vs.71).aspx#_core_mfc_support_for_mbcs_strings


下面也稍微介绍一下这两种编码方式。

ASCII字符集的缺陷:ASCII 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。


ANSI编码与MBCS(多字节编码):ANSI(美国国家标准协会),也就是说,每个国家(非拉丁语系国家)自己制定自己的文字的编码规则,并得到了ANSI认可,符合ANSI的标准,全世界在表示对应国家文字的时候都通用这种编码就叫ANSI编码。至于简体中文编码GB2312,实际上它是ANSI的一个代码页936。

多字节字符系统或者字符集,基于ANSI编码的原理上,对一个字符的表示实际上无法确定他需要占用几个字节的,只能从编码本身来区分和解释。因此计算机在存储的时候,就是采用多字节存储的形式。也就是你需要几个字节我给你放几个字节,比如A我给你放一个字节,比如"中“,我就给你放两个字节,这样的字符表示形式就是MBCS。在基于GBK的windows中,不会超过2个字节,所以windows这种表示形式有叫做DBCS(Double-Byte Chactacter System),其实算是MBCS的一个特例。
C语言默认存放字符串就是用的MBCS格式。从原理上来说,这样是非常经济的一种方式。


UNICODE编码:如上,ANSI有很多代码页,使用不同代码页的内码无法在其他代码也正常显示,这就是为什么日文版/繁体中文版游戏无法在简体中文平台直接显示的原因.
Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.它是一种2字节编码,能够提供65536个字符,这个数字是不够表示所有的字符的(汉语就有55000多字符),所以,通过一个代理对的机制来实现附加的917,476个字符表示,以达到所有字符都具有唯一编码.


有关编码的更多资料请参阅:

http://blog.csdn.net/softman11/article/details/6124345



1 0
原创粉丝点击