使用UNICODE提高效率

文字处理软件应该是软件开发中的一大支柱,而任何软件中字符串的处理更不可或缺。这里主要借鉴windows核心编程谈谈使用UNICODE的好处。

既然是基于windows编程,就得看看windows平台本身对字符的处理方式。由于ANSI字符采用8位进行编码,对于西欧ABC之类足够,然而对于中东的字符不实用(考虑下我们中国的汉字),所以就出现了UNICODE。window98是基于ANSI的平台,windows2000是基于UNICODE开发的平台,因此可以知道在调用Windows API的时候,假如我们在98系统上传递UNICODE字符,那么系统在背后会先把字符转化为ANSI字符然后调用API;相反,我们在2000系统上传递ANSI字符,那么会先转化为UNICODE字符。

去年看过(准确说是翻了一下,没时间看)一本书《C/C++-编程高手箴言》(梁肇新 超级解霸作者),他里面有一部分是谈到使CPU降温,很好奇翻了一下,主要讲如何使CPU少转几圈。我的感想是,要想成为一名优秀的软件开发人员,必须make good use of (有时汉语无法表达这么好) CPU和RAM,尽量少浪费时钟和内存块,当然也需要充分利用否则也是浪费,其中把握的是一个度,扯远了,回来继续谈UNICODE。

先看看使用UNICODE的好处(书上的):
1、可以很容易地在不同语言之间进行数据交换。
2、使你能够分配支持所有语言的单个二进制。exe文件或DLL文件。
3、提高应用程序的运行效率。

如何基于UNICODE编译:
只需定义宏_UNICODE或者UNICODE (VC 2005默认采用Unicode编译)

Windows宏定义处理支持ANSI和UNICODE编译
大学C、C++语言中我们学习字符表示是char,由于书中讲解全部一个模式,而开发类书籍很少讲解ANSI、UNICODE字符串区别,使得很少有人关注。在进行函数调用的时候,很少去关注接口处字符串处理,可能无意中你就使CPU多转几圈。
ANSI字符表示是char,占8位;UNICODE字符表示是wchar_t,占16位。Windows编程用宏对这两种类型进行了封装:

typedef char CHAR;
typedef wchar_t WCHAR;

表示这两种字符串数据:

CHAR chANSI[] = " hello " ;
WCHAR chUnicode[]
= L " hello " ;

同样表示字符串却要使用两种表示方法,Windows为我们定义了一套宏用来处理这些问题,例如用TCHAR宏表示字符,用_T()宏来表示字符常量类型,它根据编译字符集选项来确定具体类型。同样定义了字符处理函数宏,具体参看msdn。

下面基于提高应用程序的运行效率来探讨,纯理论分析:

CHAR chANSI[ 100 ];
WCHAR chUnicode[
100 ];
// Normal sprintf: all string are ANSI
sprintf(chANSI, " %s " , " ANSI Str " );
// Converts Unicode string to ANSI (Be careful %s and %S)
sprintf(chANSI, " %S " , L " Unicode Str " );
// Normal swprintf: all string are Unicode
swprintf(chUnicode, L " %s " , L " Unicode Str " );
// Converts ANSI string to Unicode (Be careful %s and %S)
swprintf(chUnicode, L " %S " , " ANSI Str " );

从上面可以看出,简单的一个打印函数都可能导致CPU多花时钟来进行函数调用前处理,所以编程时一定要养成好习惯,随手做到可能使你的代码与众不同。由于我们目前的系统大多是Windows 2000以上版本,采用Uincode字符集,在API调用的时候接口字符都是Unicode的,所以最好采用Unicode字符风格进行编码,这样可以减少调用时转换开销。

应该注意的问题:
假设定义一个字符数组TCHAR szName[100],当基于Unicode编译的时候,它实际占用200字节,假设有一个给字符赋值函数:

void SetName(TCHAR * pName, int iSize)

调用该函数:

SetName(szName, sizeof (szName))

这样就可能产生错误,sizeof求出的是数组所占字节数目,而不是字符个数,字符个数应该是sizeof(szName)/sizeof(TCHAR)。所以编程的时候脑袋一定要绷紧一根弦,提防类似错误。

好了,按照梁大师的理论CPU应该是降温了,按照能量守恒定律CPU热量由电产生,那我们应该是节约用电了呀!真想不到编程风格可以直接为国家节约用电,何乐而不为。开玩笑,不过我这样喜欢电脑的人确实希望电脑可以轻松一点,尤其我大学那个电脑,一转起来咔嚓响,仿佛象老人一样不堪重负,真为它担心。

你可能感兴趣的:(编程,windows,api,String,语言,平台)