三、宽字符和 Windows—本书与国际化
为国际市场准备的Windows程序不光要使用Unicode。国际化超出了本书的范围,但在Nadine Kano所写的《Developing International Software for Windows 95 and Windows NT》(Microsoft Press,1995年)一书中涉猎了许多。
本书中的程序写作时被限制成既可使用也可不使用定义的UNICODE标识符来编译。这包括对所有字符和字符串定义使用TCHAR,对字符串文字使用TEXT宏,以及注意不要混淆字节和字符。例如,注意SCRNSIZE中的 _vsntprintf呼叫。第二个参数是缓冲区的字符大小。通常,您使用sizeof (szBuffer)。但如果缓冲区中有宽字符,则返回的不是缓冲区的字符长度,而是缓冲区的字节大小。您必须用sizeof(TCHAR)将其分开。
通常,在Visual C++ Developer Studio中,可使用两种不同的设定来编译程序:Debug和Release。为简便起见,对本书的范例程序,我已修改了Debug设定,以便于定义UNICODE标识符。如果程序使用了需要字符串作参数的C链接库函数,那么_UNICODE标识符也在Debug设定中定义(要了解这是在哪里完成的,请从「Project」菜单中选择「Settings」,然后单击「C/C++」标签)。使用这种方式,这些程序就可以方便地被重新编译和连结以供测试。
本书中所有程序-无论是否为Unicode编译-都可以在Windows NT下执行。只有极少数情况例外。本书中按Unicode编译的程序不能在Windows 98中执行,而非Unicode版则可以。本章和第一章的程序就是两个特例。MessageBoxW是Windows 98支持的少数宽字符Windows函数之一。在SCRNSIZE.C中,如果用Windows函数wprintf代替了_vsntprintf(您还必须删除该函数的第二个参数),那么SCRNSIZE.C的Unicode版将不能在Windows 98下执行,这是因为Windows 98不支持wprintfW。
在本书的后面(特别在第六章,介绍键盘的使用时),我们将看到,编写能处理远东版Windows双字符集的Windows程序不是一件容易的事情。本书没有说明如何去做,并且基于这个原因,本书中的某些非Unicode版本的程序在远东版的Windows下不能正常执行。这也是Unicode对将来的程序设计如此重要的一条理由。Unicode允许程序更容易地跨越国界。