使用UNICODE提高效率
2011-06-11 09:48
295 查看
文字处理软件应该是软件开发中的一大支柱,而任何软件中字符串的处理更不可或缺。这里主要借鉴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编程,就得看看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热量由电产生,那我们应该是节约用电了呀!真想不到编程风格可以直接为国家节约用电,何乐而不为。开玩笑,不过我这样喜欢电脑的人确实希望电脑可以轻松一点,尤其我大学那个电脑,一转起来咔嚓响,仿佛象老人一样不堪重负,真为它担心。
相关文章推荐
- 我常使用的20个互联网工具,推荐9个给你提高工作效率
- 使用数据库连接池提高执行效率
- Github 开源:使用升讯威 Mapper( Sheng.Mapper)与 AutoMapper 互补,大幅提高开发效率!
- vs使用Code Snippet提高工作效率
- 函数的入参使用数据类, 在需求变化时, 提高工程的维护效率
- 使用JNDI配置Tomcat数据源[提高访问数据库效率]
- [转]使用 Emmet 提高编写 CSS 的效率
- 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基本设置,提高开发效率
- 使用分治算法提高多项式计算效率:
- 灵活使用Excel可能会提高Java代码编写效率
- Hadoop 使用Combiner提高Map/Reduce程序效率
- 使用Fiddler提高前端工作效率 (介绍篇)
- 使用动态代理,提高工作效率
- ASP.Net使用缓存技术提高效率
- ListView使用技巧之ViewHolder模式提高效率
- 使用tapestry-prop提高Tapestry运行效率
- android群英传笔记——ListView常用优化技巧(一、使用ViewHolder模式提高效率)
- 使用supervisor提高nodejs调试效率
- 使用supervisor提高nodejs调试效率
- 使用supervisor提高nodejs调试效率