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

1. 问题及分析

 

最近在本身写的MFC程序时,编译老是碰到如下的相似的问题:windows

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

相似的问题还有“MessageBoxW”的问题。函数

 

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

 

[cpp] view plain copyspa

  1. #ifdef UNICODE  
  2. #define TextOut  TextOutW  
  3. #else  
  4. #define TextOut  TextOutA  


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

 

 

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码还不足以用来表示相似中文这样的多字节语言。code

 

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

 

有关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

相关文章
相关标签/搜索