http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727


貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的个人心得总结一下。

首先,char是ascii编码,wchar_t是unicode,这是大家都知道的,但是这也是纠结所在。所以个人经验,在做windows程序时,最好是忘记这两种变量的存在,而记住windows里只有一种字符变量,那就是TCHAR。(虽然TCHAR只不过是对char或tchar的宏定义而已)

也就是说,程序里既不要出现char也不要出现wchar,只能出现TCHAR,这样就把纠结统一起来了。这也是程序通用性的要求。


接下来,还必须注意以下几点:

1、既然程序里不能出现char,那表示字符串时,就不能再习惯性的用char*了。应该改为TCHAR*,或者是PTSTR。后一种是windows的变量,类似的有:PSTR、PTSTR、LPTSTR、LPSTR、PCTSTR等等等等。这也是让人一开始接触会头大的地方。其实并非如此恐怖,我以PCTSTR为例做个解释:P代表指针(和LP是一个东西,LP的本意是Long Pointer,16位windows时代的遗留物。),C代表const,T代表TCHAR,STR代表字符串。所以PCTSTR其实就是const TCHAR* 的意思。而PSTR也就是char* 的意思。所以我们在表示字符串时也不能使用PSTR等不带T的变量类型名。


2、表示字符串常量时,不能简单的用双引号括起来,因为那代表ascii字符串。同样也不能在前面加L,因为那代表unicode。我们的程序要做到的是通用性,即不是ascii也不是unicode。所以我们在字符串前应该加的是TEXT, 比如MessageBox(NULL, TEXT("Fypher"), TEXT("Fypher"), MB_OK)。TEXT还可用于字符。比如TCHAR m=TEXT('A');


3、TCHAR tchTest[50]。tchTest能装多少字符?哈!不要习惯性的sizeof(tchTest)了,应该_countof(tchTest)或者sizeof(tchTest)/sizeof(TCHAR)。因为我们不确定TCHAR到底是char 还是 wchar_t。


4、该和一堆老朋友说再见了……我们不能再使用以前的字符串处理函数或者字符处理函数了。比如strlen、strcat、strcmp等等等等……因为这些是ascii专用的,通通改成使用T家族的吧。前缀都换成_tcs。比如_tcslen、_tcscat、_tcscmp等等……顺便补充一下wcs前缀是wchar_t使用的。恩,还有大家用得超爽的sprintf,今后就改成_stprintf了吧~呵呵。补充:swprintf是wchar_t它家的。对了,windows认为_tcscpy、_tcscat等不安全,所以使用这些函数编译器会报警。可以改用windows推出的_tcscpy_s、_tcscat_s等“安全”函数,其实就是多了个参数用来指明缓冲区大小(记得用_countof哦!^_^)。windows还推出了形如StringCchCat的一套字符串处理函数,我没怎么用过。windows也有一个字符串比较函数CompareString。功能比_tcscmp强大多了。比如可以设置忽略大小写等。


5、IsTextUnicode函数可以用过一系列统计学的方法判断某个字符串是不是unicode字符串。MultiByteToWideChar和WideCharToMultiByte函数可实现Ascii和Unicode字符串的相互转化。这些的使用场合都不大。因为我们的程序应该做到“没有”ascii和unicode。


6、恩,虽然绝大多数情况下应该使用TCHAR,但是记住GetProcAdress这个特殊的函数吧,它的参数只能是char*。因为在导出函数表里函数名是用ascii码写的……

7、最后一点,记得要#include ,呵呵。 由于windows内核采用的是UNICODE,UNICODE版的程序必然比ASCII版的程序效率高(比如不用在调用函数时在堆里分配空间把参数转成UNICODE,然后再调用UNICODE版的函数),所以我们最好是在程序的开头加上#define UNICODE和#define _UNICODE,把程序转换成UNICODE版的。如果程序的字符串处理完全按照上面的通用性要求做了是不会出错的。

恩,就这些了,呵呵。