VC++中应当注意对VC字符集的设置

商帝国咨询头像

阅读 22363 | 分类:文章

VC真是一个非常笨,非常不友好的工具,还是这样说,VC(MFC)和现在流行的。net framework java比起来就想石器时代跟工业时代相比一样!

    接触MFC也有几年了,为了它有过加班、有过熬夜、甚至通宵,代码没有十万行也应该有几万行了。但是MFC就是这么牛,它牛得不但令新手忘而却步,而且常常令有经验的软件工程师也栽跟斗。最近由于一个小小的环境设置设置问题花了很多时间,这跟用惯了VC6突然转到VC2005有关,但关键还是VC实在太笨了,它让我在一周内连续两中招次!

    第一次中招是这样的,很简单:

    我不知道VC.net2005默认工程默认设置是采用“Unicode字符集”(Unicode Character Set)的,以前用VC6工程的时候默认是“多字符集”(Multi-Byte Character Set)的。以前也没有用过VC.net2005啊,我一直认为。net是用来在framework上面编程的,在MFC上编程没有必要打开庞大的。net2005,把机器弄得像牛拉车一样。

    我声明了一个CString,按计划给它赋值,就像下面:

    CString s;

    s.Format(“count = %d”,count);

    按经验这肯定不会有错误的,但是不好意思,编译错误,因为这是我的环境采用的Unicode字符集的,而我给CString的Format函数是“多字符集”(Multi-Byte)所以编译不通过,要知道在这种设置下使用MessageBox(“ddd”);编译是不会通过的,因为系统调用的是MessageBoxW,即Unicode宽字符集的那个函数。

    还好我根据编译器的提示把s.Format(“count = %d”,count);改成s.Format(_T(“count = %d”,count);就搞定了,_T代表一个宏,宏的意思就是把字符串转成宽字符表示。同样的,MessageBox(“ddd”);可以为MessageBox(_T(“ddd”));

    但是还有个问题就是,所有窗体显示的东西都是宽字符的,例如a在内存里就是a\0两个字节,前面一个字节a后面是\0,当从窗体取下数据(例如用户输入)要跟其他平台交互时,例如网络传输到远端机器。如果那边使用的不是Unicode字符集,就会出问题,为了使界面和后台传输一致,只好使用把宽字符转换成多字符集表示:

 CString strWideChar;

strWideChar.Format(_T(“这是宽字节哦”));

char buf[20];

memset(buf,0,20);

WideCharToMultiByte( //转换Unicode到Ansi

CP_ACP,

WC_COMPOSITECHECK | WC_DEFAULTCHAR,

strWideChar,

strWideChar.GetLength(),

(char *)buf, //转换到缓冲区中

20, //最多个字节

0,

0

);


    同样的,你接收到的字符串想要在界面正常显示,还必须把它转换成宽字节表示:

 char chBytes[8];

memcpy(chBytes,”aaaaaaa\0”,8);

WCHAR wch[9];

n = MultiByteToWideChar( //转换Unicode到Ansi

CP_ACP,

0,

chBytes,

8,

wch, //转换到缓冲区中

8 //最多个字节

);

wch[n] = '\0';


    这样每次从界面取数据和把数据显示到界面上都要先做处理,但是也可以把编译环境设置成“多字符集”(Multi-Byte Character Set),就可以避免这样转换来转换去(可惜我发现的时候代码已经差不多写完了)。就是在“Project->Configuration Properties->General->Character Set,选择”Use Unicode Character Set“就是使用Uncode字符集,选择” Use Multi-Byte Character Set“就是多字节字符集。

    第二次中招,god,花了我好长时间才找到问题:

    我在CodeProject上找了一个很厚道的老外写的一个继承了CDialog窗体类CResizableDialog的源码,这个类的作用是使MFC的窗体放大缩小时,窗体上的控件可以定位(Auchor),不要小看这个小小的每天都要用到的功能,用MFC实现真的很麻烦。很佩服那个老外写了那么多代码(当然跟他们的条件有关,资本主义国家的工人随便找个工作就可以衣食无忧,病了政府照顾,我们做“挨踢”的活得像民工一样,当然没有那个闲情去写那么好的代码免费给别人使用,这是题外话)。

    我拿了那个现成的工程,直接在我的工

留言区(共0条)

暂无留言,快来抢占沙发~
作者声明:非原创
平台声明:文章及评论仅代表作者本人观点,五略商书系信息发布平台,仅提供信息存储空间服务,如有侵权,请联系13521509118。转载请注明作者和出处:转自五略商书m.shangdiguo.com,作者商帝国咨询!