UNICODE 编程入门(3)

阅读更多

下面的这个例子使用 Win32 API 函数和通用数据类型设置 C 盘的卷标。

//******************
//
设置 C 盘的卷标
//******************

// drvsvl.cpp

#include

#include

void main()

{

   BOOL success;

   char volumeName[MAX_PATH];

   cout << "输入新的 C 盘卷标:";

   cin >> volumeName;

   success = SetVolumeLabel("c:\\", volumeName);

   if (success)

      cout << "成功\n";

   else

      cout << "错误代码:" << GetLastError() << endl;

}

通过使用 TCHAR 数据类型,将这段代码最上面的字符数组声明为两个字节的字符。TEXT 宏再次被用于字符串常量:

void main()

{

   BOOL success;

        

   TCHAR volumeName[MAX_PATH];

   cout << TEXT("输入新的 C 盘卷标: ");

   cin >> volumeName;

   success = SetVolumeLabel(TEXT("c:\\" ), volumeName);

   if (success)

      cout << TEXT("成功\n");

   else

      cout << TEXT("错误代码:") << GetLastError() << endl;

}

Visual C++ 中的通用数据类型

     Visual C++ 提供了几种 MFC 专用的数据类型用于创建具有国际化特性的应用程序。这些定义很通用,完全可以在 UNICODEASCIIDBCS (双字节字符集) MBCS (多字节字符集)。由于篇幅所限,本文不打算涉及所有上面提到的这些字符集。有关它们的详细资料请参考相关资料。MFC 提供了一种透明的方式来实现这些字符集。通用数据类型的映射到哪个字符集以及映射方式是根据工程的设置决定的,默认值为 ASCII 模式,其它几个可选项是 MBCSDBCS 或者 UNICODE。本文主要讨论 UNICODE,所以下表中只列出了 ASCII UNICODE 字符之间的映射关系:


表一:

通用 MFC 数据类型

映射到 ASCII

映射到 UNICODE

注释

_TCHAR

char

wchar_t

_TCHAR 是一个映射宏,当定义 UNICODE 时,该数据类型映射到 wchar_t,如果没有定义 UNICODE,那么它映射到 char

_T _TEXT

char 常量字符串

wchar_t 常量字符串

功能与宏相同,在 ASCII 模式下,它们被忽略,也就是说被预处理器删除掉,但是如果定义了UNICODE, 则它们会将常量字符串转换成等价的 UNICODE

LPTSTR

char*, LPSTR(Win32)

wchar_t*

可移植的32位字符串指针。它将字符类型映射到工程设置的类型。

LPCTSTR

const char*, LPCSTR(Win32)

const wchar_t*

可移植的32位常量字符串指针。它将字符类型常量映射到工程设置的类型。


使用表一中列出的通用数据类型,开发人员可以保证所创建的工程始终是针对一种字符集,这些通用数据类型就相当于占位符,在编译时被特定的字节所替代,使得应用程序在 ASCII UNICODE 模式下都能运行。但是,有一点要特别注意,那就是上述的通用数据类型为微软专有,与 ANSI 标准并不兼容。有关微软提供的这些通用数据类型详细描述请参考 MSDN 库文档。

有关技术注释

    
为了成功编译支持 UNICODE MFC 程序,必须使用 MFC UNICODE 版本库。该库在定制安装Visual C++ 时是个可选安装项。
    
有一点很重要:那就是不使用 UNICODE 标准在外观上并不影响程序的执行。也就是说,上面提到过的代码不管设没设置 _UNICODE 生成选项,最终都能生成正常运行的程序。当开发人员使用多个版本的Win32 API函数时才会出现问题。
    
在使用多个版本的 Win32 API函数(任何有字符或字符串作为参数的 Win32 API函数)时,编译器根据是否设置 _UNICODE 指令来决定调用正确的函数。如果没有定义_UNICODE,那么编译器将默认调用 ASCII 版本函数。

结束语

    综上所述可以看到,编译 UNICODE 版本的程序并不难。只是在编写代码时记住函数调用上些微的变化。微软为此提供的扩展是开发人员能够以透明的方式选择所用的字符集,为应用软件的国际化打开了方便之门。
     Jeffrey Richter
在他的《Windows 核心编程》(机械工业出版社-王建华、张焕生、侯丽坤等译)一书中专门用一章讨论了 UNICODE。翻译得也不错。有兴趣的朋友不妨找来看看。

你可能感兴趣的:(编程,MFC,C,C++,C#)