现在很多软件都向国际化版本靠拢,对UNICODE方式的支持也似乎逐渐成为众多软件开发者的追求。
对于桌面搜索,对UNICODE的支持非常重要。搜索引擎本身支持非UNICODE和UNICODE两中模式的,但是在实际的应用中,采用UNICODE方式会带来更多的便利,主要体现是在分词上,由于非UNICODE方式,英文字母是一个直接而汉字是两个直接,导致分词相对来说比UNICODE方式要复杂,我们不得不对每个字节去判断是汉字的半个字还是一个ASC码。
当然为了那些不支持UNICODE的windows操作系统(如95),程序也需要在非UNICODE模式下运行。所以,最终的方案是支持多种编译模式,根据需要编译出不同的版本。
为了支持不同的编译模式,我们需要改写我们习惯上的大部分字符串和内存相关的变量和函数。在TCHAR.h中对这些函数进行了映射。打个简单的比方,对于字符的定义如下:
#ifdef _UNICODE
typedef short TCHAR;
#else
typedef char TCHAR;
#endif
也就是说在我们什么的_UNICODE编译模式下,会采用双字节来存储一个字符,而非UNICODE模式下就是单字节。我们在写代码声明字符时,就需要用
TCHAR cTemp;
的方式,这样无论那种模式都可以支持。
同样的,对于字符串操作和内存操作函数也需要相应的改变,如strcpy要改成_tcspy。
在实际应用中,我们需要关心的有下面这些:
TCHAR,LPTSTR,LPCTSTR,str开头的函数都编程_tcs开头,_T
特别要说一下的是_T,一般我们给字符串赋常量时是用"aaa"方式,但是在这里我们就需要用_T("aaa")。
说完编码时候需哟注意的问题,下面要说的是怎么设置编译模式,一般创建工程后有2种编译模式,debug和release。首先我们要添加新的编译模式。
在build->configuations里面添加Debug_Unicode和Release_Unicode
然后在Project->settings中设置这两个编译模式:
1.在c/c++页中Preprocessor definitions的最后添加,_UNICODE 表示UNICODE编译模式
2.在link->Project options中添加/entry:"wWinMainCRTStartup" 表示采用wWinMainCRTStartup 入口,这是因为unicode版本程序入口为wWinMainCRTStartup 。如果不加的话会出现error LNK2001: unresolved external symbol _WinMain@16的链接错误。
最后需要说明的一点是,关于国际化版本。一个理想的过程是在国际化时(如中文版变成英文版),做国际化的人不需要拿到源代码也能翻译。这个就需要我们把所有的字符串都放在固定的文本文件或者是资源文件中,国际化时只需要修改这两个文件就可以了。