love in C++, live on MFC

to get ready...

C++博客 首页 新随笔 联系 聚合 管理
  47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks

动机 : 在没有装中文字体的机器上显示中文

如果不是unicode,某些中文字符会在不同的codepage上出现乱码;如果当前codepage为韩文时,某些中文字会变成韩文的样子,奇怪.

Step1: define _UNICODE, undefine _MBCS

宏定义UNICODE, _UNICODE定义两个也可以,定义一个也可以,windows的头文件会保证两个都会被定义.

#ifdef _UNICODE
#ifndef UNICODE
#define  UNICODE  //  UNICODE is used by Windows headers

#endif
#endif

 
#ifdef UNICODE
#ifndef _UNICODE
#define  _UNICODE         //  _UNICODE is used by C-runtime/MFC headers
#endif
#endif

 

Step2: 更改变量类型

比如 char -> TCHAR

但是 ,并不是说所有的char类型都不能用了.如果需要用,并且函数的参数/返回值什么的都不冲突,char类型还是可以用的.

Step3: 更改常量字符串形式

" abc " -> _T(" abc ")

因为开始写程序时没有注意 ,造成这样的常量字符串形式非常多,一个个改起来很烦,我写了个小插件,可以讲 abc 选中后点一下 button就能变成_T( abc ),有点用,代码也非常的短.

Step4: 替换某些函数

比如atoi -> _ttoi

在这里遇到一个问题,就是atof的替换.

按照msdn, atof应该被_ttof替换

TCHAR.H routine

_UNICODE & _MBCS not defined

_MBCS defined

_UNICODE defined

_tstof

atof

atof

_wtof

但是奇怪的是,VC6里面不认识_tstof这个函数,VC.net 2003就可以.

有两个解决的办法:

1)      因为atof只是替换为浮点数,所以这里用WideCharToMultiByte转化一下之后再调用atof也是可行的

2)      呵呵,strtod的替换函数_tcstod,哈哈,当然参数要变一下,我觉得这个方法不错,不要被msdn限制死了

Step5: 检查一下调用其他 dll 的接口函数

因为项目还用了另外一个dll,其中有些接口需要char*参数,这个时候就必须用WideCharToMultiByte转换一下了.

VC里面的设置:
1) 等把所有的编译error改完了之后一编译,除了个link错误,不过msdn有解释:
If you are using Unicode and MFC, you will get an unresolved external on _WinMain@16 if you don’t create an entrypoint to wWinMainCRTStartup. Use the /ENTRY option or type this value in the Project Settings dialog box. (To find this option in the development environment, click Settings on the Project menu, then click the Link tab, and click Output in the Category box.)

2)终于编译成功了,调试的时候却发现CString的值不能在QuickWatch窗口中显示了
tools->option->
in the debug tab u can find a check box Labeled "Display unicode strings"
Check it.

问题 : 直接用 ANSI dll 中的 CString

在使用dll的时候,需要直接使用dll中的一个变量,CString类型,因为这个dll还没有改为unicode,所以在直接使用其变量时有点问题,使得值不对.(是不是这个原因还没有完全验证,应该是的)

到这里 , 宣布移植失败 !

/*补充:
结果是失败,但是基本移植代码的所有步骤都有了。而且,也指出了如果需要调用的dll不是unicode,每次调用/传递参数时,都要转换,很烦。
后来我把dll的代码也移植了下,现在运行的很好,韩文、中文都可以显示,不管你当前语言是什么。
*/

还有一篇讲移植步骤的,更全面,适合更复杂的情况:
Cheat Sheet:Unicode-enabling Microsoft C/C++ Source Code (http://www.i18nguy.com/unicode/c-unicode.html)

 

posted on 2006-05-18 16:09 flyingxu 阅读(3163) 评论(6)  编辑 收藏 引用 所属分类: VC/MFCBug of Today

Feedback

# re: 把代码移植成UNICODE 2006-05-19 09:47 沐枫
狂晕。看了半天,来了一句“失败”!!!  回复  更多评论
  

# re: 把代码移植成UNICODE 2006-05-22 23:48 flyingxu
@沐枫
呵呵,结果是失败,但是基本移植代码的所有步骤都有了。而且,也指出了如果需要调用的dll不是unicode,每次调用/传递参数时,都要转换,很烦。
后来我把dll的代码也移植了下,现在运行的很好,韩文、中文都可以显示,不管你当前语言是什么。
  回复  更多评论
  

# re: 把代码移植成UNICODE 2009-12-09 17:29 wzyzb@qq.com
@flyingxu
你的那个小程序能不能发给我用下 有源码更好 先谢了,  回复  更多评论
  

# re: 把代码移植成UNICODE 2009-12-09 17:30 wzyzb@qq.com
我的邮箱wzyzb@qq.com  回复  更多评论
  

# re: 把代码移植成UNICODE 2010-01-08 20:00 tyt2008cn
楼主,拜求那个替换 "abc"为_T("abc")的小工具,
正准备把一个MFC工程移植为UNICODE,杯具中,我的邮箱tyt2008cn@126.com, 先谢过了!  回复  更多评论
  

# re: 把代码移植成UNICODE[未登录] 2010-11-19 16:23 jacky
我这里也有个工具,请看:
http://hi.baidu.com/qiujiejia/blog/item/46057f2bacf7abeae7cd407b.html

和:
http://hi.baidu.com/qiujiejia/blog/item/4af2261bbeba5deaaf5133bf.html  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理