动机 : 在没有装中文字体的机器上显示中文
如果不是unicode,某些中文字符会在不同的codepage上出现乱码;如果当前codepage为韩文时,某些中文字会变成韩文的样子,奇怪.
Step1: define _UNICODE, undefine _MBCS
宏定义UNICODE, _UNICODE定义两个也可以,定义一个也可以,windows的头文件会保证两个都会被定义.
#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)