您的位置:首页 > 编程语言 > C语言/C++

MSDN文档翻译 Learn to Program for Windows in C++ 005 序章第三节

2015-01-21 23:03 681 查看
序章/第三节:字符串处理

    Windows在UI元素、文件名、等等上,原生的支持Unicode字符串。Unicode是目前首选的字符编码方案,因为它支持目前所有的字符形式与语言。Windows所采用的Unicode编码方案是UTF-16编码方案,在这种方案里,每一个字符被编码成一个16位宽的整数值。UTF-16字符被称为“宽字符”,以区别8位的ANSI字符。Visual C++编译器用内置数据类型wchar_t来支持宽字符。在头文件<WinNT.h>中也定义了宽字符类型的别名,如下所示:

        typedef wchar_t WCHAR;

    你会在MSDN的代码样例中看到以下两种代码:第一种声明一个宽字符变量,另一种声明一个宽字符串。具体做法就是在字面值常量之前加上一个【L】前缀,将其转换为宽字符编码方式的字符/字符串。

        wchar_t a = L'a';

        wchar_t *str = L"hello";

    这是一些其它的字符串相关的类型别名,在后续部分你将逐渐接触:

        类型别名                        定义

        CHAR                            char

        PSTR / LPSTR                    char ×

        PCSTR / LPCSTR                  const char *

        PWSTR / LPWSTR                  wchar_t *

        PCWSTR / LPCWSTR                const wchar_t *

1:  Unicode与ANSI函数

    当微软宣布Windows操作系统支持Unicode编码方式时,为了减轻过渡时期的阵痛,微软提供了两套平等的API,一套用以处理ANSI字符串,一套用以处理Unicode字符串。例如,下面是两个用以设置窗口标题栏文本的函数:

        SetWindowTextA  // 接收一个ANSI字符串

        SetWindowTextW  // 接收一个Unicode字符串

    在内部,ANSI版本将字符串转换成了Unicode形式(因为Windows操作系统支持的是Unicode编码,而不是ANSI编码)。Windows头文件中也定义了一个宏,当预处理宏【UNICODE】被定义时,字符串将会以Unicode编码形式被处理,否则,字符串将被ANSI形式处理,宏定义如下:

        #ifndef UNICODE

        #define SetWindowText SetWindowTextW

        #else

        #define SetWindowText SetWindowTextA

        #endif

    在MSDN文档中,这个函数被描述成了【SetWindowText】函数,尽管这并不是真正的函数名,而是一个宏的名称。

    现在新的应用程序应该始终调用Unicode版本的函数。世界上很多语言都需要用Unicode编码来表示,如果你用ANSI字符串,想要将你的应用程序在非英语地区本地化则无疑是天方夜谭。同时,ANSI版本的函数相较而言效率也比较低下,因为要运行ANSI版本的函数,程序运行时,操作系统需要将ANSI编码方式的字符串先翻译成Unicode编码形式的字符串。根据你个人的偏好,你可以直接调用Unicode版本的函数,例如直接使用【SetWindowTextW】,也可以调用宏【SetWindowText】。MSDN上的代码样例经常使用宏,但实际上这两种形式是完全等价的。并且很多新的Windows
API接口只有Unicode版本,没有相应的ANSI版本。

2:  TCHARs

    让我们回到那个需要同时支持NT平台的时代吧,你需要支持Windows 95/98/Me,在这个过渡的时代,有一种非常有用的策略,可以实现用相同的代码来编译包含Unicode字符串的程序与包含ANSI字符串的程序,具体编译哪种编码,取决于具体的平台。为了实现这个策略,Windows SDK提供了将字符串映射为Unicode编码或ANSI编码的宏,而具体映射为什么编码,取决于具体一平台。

        宏           对应的Unicode类型            对应的ANSI类型

        TCHAR           wchar_t                     char

        TEXT("x")       L"x"                        "x"

    例如,下面这句代码:

        SetWindowText(TEXT("My Application"));

    将被解析为下列代码语句中的某一句:

        SetWindowTextW(L"My Application");      // Unicode函数与宽字符串

        SetWindowTextA("My Application");       // ANSI函数与8位字符串

    而在如今,宏【TEXT】与【TCHAR】就很少见了,因为现在所有的应用程序都应该使用Unicode编码,你可能会在一些有历史的代码或MSDN的代码样例中见到它们

    Microsoft的C语言运行时库中的头文件也定义了一些类似的宏,例如:在宏【_UNICODE】未被定义的情况下,【_tcslen】将被解析为【strlen】,否则将会被解析为【wcslen】,【wcslen】是宽字符版本的【strlen】。

        #ifndef _UNICODE

        #define _tcslen     wcslen

        #else

        #define _tcslen     strlen

        #endif

    注意:有些头文件使用的预处理宏名为【UNICODE】,有些则用的是带一个短下划线的宏名【_UNICODE】。在实际应用时注意要将两个宏名都定义掉,当你新建一个项目时,Visual C++将这两个宏都按默认处理。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows visual c++