Windows、字符集和_T宏

Microsoft Windows98和Microsoft Windows NT 使用两种不同的字符集来构成字符和字符串。

Win98 及其以前 的版本使用 8位的ANSI字符集,这类似于许多程序员都熟悉的ASCII字符集。

Win NT和win2000使用16位的Unicode字符集,它是ANSI字符集的一个超集。Unicode适用于国际市场上销售的应用 程序,因为它包含各种各样来自非U.S字母表的字符 。

使用ANSI字符集编译的程序可以在Windows NT和 Windows 2000上运行,但Unicode程序运行起来要稍微快点。因为Windows NT和 Windows 2000不需要对每个字符进行ANSI到Unicode的转换。Unicode应用程序不能在Win98运行,除非你将每个传送到Windows的字符进行从Unicode到ANSI的转换。

在编译应用程序时,你可以选 其一进行编译。如果你想在win98和win2000上部署,它可能需要你将字符串变成与字符集无关的。然后,通过对工程的生成 设置进行简单的更改或者在头文件中添加#define,你可以告诉编译器是产生ANSI版本还是产生Unicode版本。如果你将按如下方式将字符串常量进行编码:

“Hello”

那么编译器将从ANSI字符组成该字符串。如果你按如下 方式声明了字符串:

L“Hello”

那么编译器将使用UnicodeI字符.但是如果你使用MFC的_T宏,如下所示:

_T("Text")

如果定义了预处理程序符号_UNICODE,那么编译器将使用Unicode字符,而如果没有定义该处理程序符号,那么编译器将使用ANSI字符。

如果你所有的字符串常量都使用_T宏声明,那么你可能通过定义_UNICODE生成 一个特殊的仅适用Win NT的版本。隐式定义这个符号 将定义 一个名为UNICODE(没有下划线),它将选 择众多WIndows  API函数中的Unicode版本,这些API函数具有ANSI和Unicode  两种版本。

使用_T宏修饰字符串常量就足以使一个应用程序完全不关心其字符集吗?回答是并不一定。你必须还要做以下工作:

  • 将字符声明为TCHAR类型而不是char类型。如果定义了_UNICODE符号,TCHAR将求值为wchar_t,它将是一个16位Unicode字符,如果没有定义,TCHAR将是普通的char类型
  • 不要使用char*或wchar_t*来声明TCHAR字符串的指针,应使用TCHAR*.或者更佳的LPTSTR(指向TCAHR字符串的指针)或LPCTSTR(指向const TCHAR字符串的指针)数据类型。
  • 不要认为一个字符只有8位宽。 如果要将以字节表示 的缓冲区长度转变为以字符表示的缓冲区长度,可以借助sizeof(TCHAR)划分缓冲区长度 。、
  • 将对C运行时间库(例如,strcpy)中字符串函数的调用替换为windows头文件Tchar.h(例如_tcscpy)中对应 的宏。
考虑以下 代码,其中使用了ANSI字符集:
char szMsg[256];
pWnd->GetWindowText(szMsg,sizeof(szMsg));
strcat(szMsg,"is the window title");
MessageBox(szMsg);

如果将上面的代码改成也字符集无关,就是下面的代码:

TCHAR szMsg[256];
pWnd->GetWindowText(szMsg,sizeof(szMsg)/sizeof(TCHAR));
_tcscat(szMsg,_T("is the window title"));
MessageBox(szMsg);

摘抄自《MFC  Windowt程序设计》(第二版)ISBN:978-7-302-15042-8


你可能感兴趣的:(windows,工作,api,Microsoft,mfc,编译器)