万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
文字处理软件应该是软件开发中的一大支柱,而任何软件中字符串的处理更不可或缺。这里主要借鉴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 万连文 阅读(2213) 评论(12)  编辑 收藏 引用 所属分类: 乱七八糟

FeedBack:
# re: 使用UNICODE提高效率
2006-09-11 20:54 | chenger
梁肇新那本书……
关于他写的Windows编程的东西,我不是太了解,不好评论。
只是觉得看他的文字很令人不爽。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-11 22:14 | 笨笨
使用UNICODE提高效率不是绝对的;从我的理解,CPU读100个字节肯定要比读200个字节少用时间,如果转换的时间比100个字节读取的时间短,那么为什么使用UNICODE可以让CPU少转?
所以使用UNICODE提高效率纯粹是抄做,没有数据的依据的抄做。
  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-11 22:40 | 万连文
为了软件国际化,软件开发最好采用Unicode,以这个作为前提,我们调用API时候,采用ANSI字符到接口地方必须会经过一个转化过程,这个就是额外花费。至于你谈到得那个时间我没有考证,可能一时半会无法考证,不过按照常理,你也没有给出依据,既然选择微软,还是跟着它走好了。另:采用Unicode字符可以避免混合字符集使用带来一些隐晦的混淆。用Spy++随便看一个MicroSoft开发的Windows窗口,好想都是Unicode的。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 02:59 | shaker
适用UNICODE不是在乎它会不会带来效率优势 而是更加的适合国际化 区别不同的字符集

梁大师那本书 怎么看完全是个人观点 个人觉得还是有可取的地方的  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 08:28 | 开个玩笑
按这个说法,是不是你不提交字符串,CPU就不转了啊,如果这样的话,那就一定省了能源了,呵呵  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 08:44 | 笨笨
上面说的就对了,UNICODE不是效率优势,在于国际化,实际上效率也没有优势。
考证上面的时间其实也比较简单。所以不要误导我们这样的读者。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:00 | 梦在天涯
windows 2000 的即支持ANSI也支持unicode的开发,所以随便你用那种字符集编程都可以很好的运行.但是Windows 2000 是使用U n i c o d e 从头进行开发的,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要U n i c o d e 字符串。如果调用任何一个Wi n d o w s 函数并给它传递一个A N S I 字符串,那么系统首先要将字符串转换成U n i c o d e ,然后将U n i c o d e 字符串传递给操作系统。如果希望函数返回A N S I 字符串,系统就会首先将U n i c o d e 字符串转换成A N S I 字符串,然后将结果返回给你的应用程序。所有这些转换操作都是在你看不见的情况下发生的。当然,进行这些字符串的转换需要占用系统的时间和内存。

例如,如果调用C r e a t e Wi n d o w E x 函数,并传递类名字和窗口标题文本的非U n i c o d e 字符串,那么C r e a t e Wi n d o w E x 必须分配内存块(在你的进程的默认堆中),将非U n i c o d e 字符串转换成U n i c o d e 字符串,并将结果存储在分配到的内存块中,然后调用U n i c o d e 版本的C r e a t e Wi n d o w E x函数。

对于用字符串填入缓存的函数来说,系统必须首先将U n i c o d e 字符串转换成非U n i c o d e 字符串,然后你的应用程序才能处理该字符串。由于系统必须执行所有这些转换操作,因此你的应用程序需要更多的内存,并且运行的速度比较慢。通过从头开始用U n i c o d e 来开发应用程序,就能够使你的应用程序更加有效地运行。

windows xp 也是的,但是98,ce等版本不是,<<windows核心编程>>中有说,也可以看我的blog中"windows核心编程--字符集"一文.

  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:05 | 梦在天涯
另外,使unicode是软件可以更快更高效的在各国间转化,也就是国际化,而改动很少或几乎不用修改代码  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:08 | 万连文
如果说误导应该不至于,使用Unicode也是微软建议的。出了例子是Windows核心编程里面的,我本人觉得算是合理。至于别人是否赞同和采用,个人爱好问题。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:10 | LOGOS
看你的东东越来越辛苦了。我必须看一遍,关掉页面,再打开,写评论,不然memory就被吃光了。
unicode的本质意义是简便的国际化,但是并不是说可以很随意的使用unicode了,因为软件常常依赖于别的库,并不是每一个库都有unicode实现的。
个人觉得,unicode的那点加速无关紧要。如果你的软件慢了,还是从别的地方进行优化的好。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:41 | 笨笨
LZ还没有明白所说,提倡UNICODE没有任何问题,该提倡,但不能以效率来说明问题。  回复  更多评论
  
# re: 使用UNICODE提高效率
2006-09-12 09:43 | 笨笨
One word, just 跑题了!呵呵  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜