“簡單地說,Unicode擴充自ASCII字元集。在嚴格的ASCII中,每個字元用7位表示,或者電腦上普遍使用的每字元有8位寬;而Unicode使用全16位字元集。這使得Unicode能夠表示世界上所有的書寫語言中可能用於電腦通訊的字元、表意字元和其它符號。”
“Unicode影響到了電腦工業的每個部分,但也許會對作業系統和程式設計語言的影響最大。從這方面來看,我們已經上路了。Windows NT從底層支援Unicode(不幸的是,Windows 98隻是小部分支援Unicode)。”
“先天即被ANSI束縛的C程式設計語言通過對寬字元集的支援來支援Unicode。”
“DBCS從256代碼開始,就像ASCII一樣。與任何行為良好的字碼頁一樣,最初的128個代碼是ASCII。然而,較高的128個代碼中的某些總是跟隨著第二個位元組。這兩個位元組一起(稱作首位元組和跟隨位元組)定義一個字元,通常是一個複雜的表意字元。”
“明白Unicode和DBCS之間的區別很重要。Unicode使用(特別在C程式設計語言環境裡)「寬字元集」。「Unicode中的每個字元都是16位寬而不是8位寬。」在Unicode中,沒有單單使用8位元值的意義存在。相比之下,在雙位元組字元集中我們仍然處理8位元值。有些位元組自身定義字元,而某些位元組則顯示需要和另一個位元組共同定義一個字元。”
“使用Unicode也有缺點。第一點也是最主要的一點是,程式中的每個字串都將佔用兩倍的儲存空間。此外,您將發現寬字元執行時期連結庫中的函數比常規的函數大。出於這個原因,您也許想建立兩個版本的程式-一個處理ASCII字串,另一個處理Unicode字串。最好的解決辦法是維護既能按ASCII編譯又能按Unicode編譯的單一原始碼檔案。”
“Windows NT從底層支援Unicode。這意味著Windows NT內部使用由16位字元組成的字串。因為世界上其它許多地方還不使用16位字串,所以Windows NT必須經常將字串在作業系統內轉換。Windows NT可執行為ASCII、Unicode或者ASCII和Unicode混合編寫的程式。即,Windows NT支援不同的API函數呼叫,這些函數接受8位或16位的字串。”
/*---------------------------------------------------------------------------
SCRNSIZE.C -- Displays screen size in a message box
(c) Charles Petzold, 1998
----------------------------------------------------------------------------*/
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...)
{
TCHAR szBuffer [1024] ;
va_list pArgList ;
// The va_start macro (defined in STDARG.H) is usually equivalent to:
// pArgList = (char *) &szFormat + sizeof (szFormat) ;
va_start (pArgList, szFormat) ;
// The last argument to wvsprintf points to the arguments
_vsntprintf ( szBuffer, sizeof (szBuffer) / sizeof (TCHAR),
szFormat, pArgList) ;
// The va_end macro just zeroes out pArgList for no good reason
va_end (pArgList) ;
return MessageBox (NULL, szBuffer, szCaption, 0) ;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
int cxScreen, cyScreen ;
cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
MessageBoxPrintf ( TEXT ("ScrnSize"),
TEXT ("The screen is %i pixels wide by %i pixels high."),cxScreen, cyScreen) ;
return 0 ;
}
經由從GetSystemMetrics函數得到的資訊,該程式以圖素為單位顯示了視訊顯示的寬度和高度。GetSystemMetrics是一個能用來獲得Windows中不同對象的尺寸資訊的函數。