回炉重造之重读Windows核心编程-002-字符集
使用unicode的优势:
- 便于在不同语言之间进行数据交换。
- 让你的exe或者dll文件支持所有的语言。
- 提高应用程序的执行效率。
windows2000是使用unicode重新开发的,核心部分都需要unicode字符串。所以:
- 当参数中传入一个ansi字符串,那么系统就要先把这个ansi字符串转换成unicode,然后将unicode字符串传给系统;
- 当返回值是一个ansi字符串,那么系统首先要把unicode转成ansi,才能返回给应用程序。
这些操作必须要分配内存,调用函数,都是在你看不到的情况下发生的。因此直接使用unicode,可以让你的应用程序更加高效率地运行。
c语言对unicode的支持是wchar_t。在vs中则是定义uinicode和_unicode。
ansi改成unicode字符串有三种方式,字符串前加一个l、使用text宏和_t宏。
如果是使用的dll和调用它的exe,分别使用ansi版本和unicode版本,只需要分配内存,然后转换就可以调用了。
对于功能相同的两个函数,尽量使用unicode的版本。
shlwapi.h头文件中,也提供了操作字符串的ansi和unicode版本。
转换你的应用程序到unicode版本的一些基本原则:
- 将文本视为字符串,而不是char或者字节数组
- 对于文本字符串和字符串,使用通用数据类型(tchar或者ptstr)
- 对于字节、字节指针和数据缓存,使用显式数据类型(byte,pbyte)
- 将text宏用在字符和字符串上。
- 执行全局性替换(例如使用ptstr替换pstr)
- 字符串运算问题。使用unicode版本字符串后,在分配内存的时候必须写sizeof(szbuffer)/sizeof(tchar)。这样的失误,编译器不会发出任何警告。
windows对字符串进行操作的函数:lstrcat、lstrcmp、lstrcmpi、lstrcpy、lstrlen。这些函数是作为宏实现的。真正比较两个unicode字符串的函数是comparestring(lcid lcid, dword fdwstyle, pcwstr pstring1, int cch1, pctstr pstring2, int cch2);
- 第一个参数是函数getthreadlocale()的返回值,它返回当前语言的设置;
- 第二个参数用于标识一些标志,用于比较字符串时的方式。使用lstrcmp和lstrcmpi的话,默认值是不一样的。
其他的c运行时函数为了支持unicode的版本,例如charlower、charupper、charlowerbuff、charupperbuff、ischaralpha、isalphanumber。
最后一个是printf函数家族,有char版本的sprintf和swprintf。
资源内的字符串们,会使用unicode,不是也被系统内部转换。
确定字符串是ansi还是unicode,可以使用函数istextunicode区分,尽管它有可能返回不正确的结果。
在unicode和ansi之间转换字符串,使用两个函数multibytetowidechar和widechartomultibyte。
上一篇: 论软件架构风格
下一篇: InnoDB的数据结构交流