API入門系列之Unicode還是ASCII

字號:

今天,開始第二篇文章,這章我準備介紹一下Windows平臺下編程中Unicode編碼和ASCII編碼的相關(guān)問題。
    不知道各位新手朋友們遇到這樣的問題沒有呢,新建一個Windows應(yīng)用程序,調(diào)用MessageBox這個函數(shù),準備讓它彈出一段提示文本,可是編譯器在編譯的時候卻報錯說,不能將 const char* 或者 const char[] 轉(zhuǎn)換為 const wchar_t* 之類的提示呢,很多剛接觸Windows API編程的朋友們在這里可能就卡住了,不知如何下手解決了,其實,這就是Unicode編碼和ASCII編碼的問題了。我下面就會一一道來
    關(guān)于Unicode和ASCII具體的編碼是怎么的,我這里就不詳細介紹了,也介紹不了,如果需要深入了解,網(wǎng)上有很多這方面的專門文章,我這里就只對Unicode編碼和ASCII編碼在Windows平臺下的編程相關(guān)的內(nèi)容進行介紹。
    我們都知道Unicode和ASCII的區(qū)別就是Unicode采用2個字節(jié)來存儲一個字符,不管是英文,漢字,還是其他國家的文字,都有能用2個字節(jié)來進行編碼,而ASCII采用一個字節(jié)存儲一個字符,所以對于英文的編碼,那是足夠的了,可是對于漢字的編碼,則必須采用一些特殊的方法,用2個ASCII字符來表示一個漢字。
    我們在寫程序的過程中,勢必要和字符打交道,要輸入,獲取,顯示字符,到底是選用Unicode字符呢還是ASCII字符呢,這都是各位自己的權(quán)利。但為了程序的通用性和符合目前操作系統(tǒng)的主流趨勢,Unicode編碼是被推薦的。由于Unicode字符要比ASCII字符占用的空間大一倍,編譯出來的程序在體積上和占用的內(nèi)存上必定要大一些,不過這并不是什么很大的問題。所以微軟目前的SDK中保留了2套API,一套用于采用Unicode編碼處理字符的程序的編寫,一套用于采用ASCII編碼處理字符的程序的編寫?!±?,我們上面提到的MessageBox,它其實不是一個函數(shù)名,而是一個宏定義,我們先來看看它是怎么被定義的,再來討論它。
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif
    看到了嗎?  很簡單是不是, 如果定義了UNICODE 這個宏 那么就定義MessageBox為MessageBoxW,如果沒有定義UNICODE這個宏, 那么就定義MessageBox 為MessageBoxA,MessageBox后面的W和A 就是代表寬字節(jié)(Unicode)和ASCII,這樣,其實存在于SDK中的函數(shù)是MessageBoxW和MessageBoxA這兩個函數(shù).
    MessageBox只是一個宏而已。所以在程序中,這3個名字你都可以使用,只不過需要注意的是,使用MessageBoxA的話,那么你要注意傳給它的參數(shù),字符都必須是單字節(jié),也就是ASCII, 在程序中就是char,如果使用MessageBoxW的話,那么,字符都必須使用Unicode,程序中就是 wchar_t?!〉沁@樣有個非常不方便的地方那就是,如果你使用W后綴系列的函數(shù)的話,那么你的程序使用的字符就是Unicode字符編碼的,但是如果你需要用這個程序的源代碼編譯出字符采用ASCII編碼的程序,那么需要改動的地方就太大了。凡是涉及到字符操作的地方都需要改變。那么 ,有沒有比較好的辦法不做更改就可以用同樣的代碼編譯出ASCII版本的程序呢。
    當然有,就是我們在編程的時候盡量使用不帶后綴的宏定義,如上例,就使用MessageBox,其中的參數(shù)也不明確使用char 還是wchar_t 而是使用微軟給我們定義的TCHAR字符數(shù)據(jù)類型,它的定義和上面MessageBox函數(shù)的定義差不多,都是根據(jù)是否定義了UNICODE這個宏來判斷是將TCHAR定義為char還是wchar_t,所以這樣一來,這個TCHAR的數(shù)據(jù)類型就是可變的了,它根據(jù)工程的設(shè)置而定義為相應(yīng)的最終字符類型,這樣我們的程序就可以不做任何更改就可以輕松的編譯出另外一個版本的了。是不是非常方便。
    前面2篇文章純文字的介紹比較多,因為很多是概念性的,需要理解,后面的文章我準備配合一些小示例程序,使用一些簡單的API函數(shù),遇到的相關(guān)的概念在一并介紹的方法進行。所以,前2篇文章如果各位朋友不是很能理解,不用擔心,影響不是很大,經(jīng)過后面的學(xué)習(xí),你就會慢慢的理解前面所說的內(nèi)容了。