Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 使用UNICODE提高效率
【标  题】:使用UNICODE提高效率
【关键字】:UNICODE
【来  源】:http://www.cppblog.com/wlwlxj/archive/2006/09/11/12303.html

使用UNICODE提高效率

Your Ad Here C++博客 - 万星星 - 使用UNICODE提高效率

万星星

天才??不是,是勤奋...
师夷之技以制夷 吾尝终日而思矣,不如须臾之所学也
喝碗孟婆汤,踏过奈何桥,涅槃
I've been programming since I was 21. Started with C++, looked at Java, keen on Visual Basic and Visual C++, thinking about .NET and C#.^_^,very ridiculous.

使用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热量由电产生,那我们应该是节约用电了呀!真想不到编程风格可以直接为国家节约用电,何乐而不为。开玩笑,不过我这样喜欢电脑的人确实希望电脑可以轻松一点,尤其我大学那个电脑,一转起来咔嚓响,仿佛象老人一样不堪重负,真为它担心。

posted on 2006-09-11 20:34 万连文 阅读(27) 评论(3)  编辑 收藏 收藏至365Key 所属分类: 乱七八糟

【相关评论】
没有相关评论
【发表评论】
姓名:
邮件:
随机码*
评论*
      
|  首 页  |  版权声明  |  联系我们   |  网站地图  |
CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.