程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> API入門系列之二 -Unicode還是ASCII

API入門系列之二 -Unicode還是ASCII

編輯:VB.NET

今天,開始第二篇文章,這章我准備介紹一下Windows平台下編程中Unicode編碼和ASCII編碼的相關 問題。

不知道各位新手朋友們遇到這樣的問題沒有呢,新建一個Windows應用程序,調用MessageBox這個函 數,准備讓它彈出一段提示文本,可是編譯器在編譯的時候卻報錯說,不能將const char*或者const char[]轉換為const wchar_t* 之類的提示呢,很多剛接觸Windows API編程的朋友們在 這裡可能就卡住了,不知如何下手解決了,其實,這就是Unicode編碼和ASCII編碼的問題了。我下面就 會一一道來

關於Unicode和ASCII具體的編碼是怎麼的,我這裡就不詳細介紹了,也介紹不了,如果需要深入了解,網上有很多這方面的專門文章,我這裡就只對Unicode編碼和ASCII編碼在Windows平台下的編程相關的 內容進行介紹。

我們都知道Unicode和ASCII最大的區別就是Unicode采用2個字節來存儲一個字符,不管是英文,漢字,還是其他國家的文字,都有能用2個字節來進行編碼,而ASCII采用一個字節存儲一個字符,所以對於 英文的編碼,那是足夠的了,可是對於漢字的編碼,則必須采用一些特殊的方法,用2個ASCII字符來表 示一個漢字。

我們在寫程序的過程中,勢必要和字符打交道,要輸入,獲取,顯示字符,到底是選用Unicode字符 呢還是ASCII字符呢,這都是各位自己的權利。但為了程序的通用性和符合目前操作系統的主流趨勢, Unicode編碼是被推薦的。由於Unicode字符要比ASCII字符占用的空間大一倍,編譯出來的程序在體積上 和占用的內存上必定要大一些,不過這並不是什麼很大的問題。所以微軟目前的SDK中保留了2套API,一 套用於采用Unicode編碼處理字符的程序的編寫,一套用於采用ASCII編碼處理字符的程序的編寫。 例 如,我們上面提到的MessageBox,它其實不是一個函數名,而是一個宏定義,我們先來看看它是怎麼被 定義的,再來討論它。

#ifdef UNICODE

#define MessageBox  MessageBoxW

#else

#define MessageBox  MessageBoxA

#endif

看到了嗎?很簡單是不是,如果定義了UNICODE這個宏 那麼就定義MessageBox為MessageBoxW,如果沒有定義UNICODE這個宏,那麼就定義MessageBox為MessageBoxA,MessageBox後面的W和A就是代表寬字節(Unicode)和ASCII,這樣,其實存在於SDK中的函數是MessageBoxW和MessageBoxA這兩個函數.

MessageBox只是一個宏而已。所以在程序中,這3個名字你都可以使用,只不過需要注意的是,使用 MessageBoxA的話,那麼你要注意傳給它的參數,字符都必須是單字節,也就是ASCII, 在程序中就是 char,如果使用MessageBoxW的話,那麼,字符都必須使用Unicode,程序中就是 wchar_t。但是這樣 有個非常不方便的地方那就是,如果你使用W後綴系列的函數的話,那麼你的程序使用的字符就是 Unicode字符編碼的,但是如果你需要用這個程序的源代碼編譯出字符采用ASCII編碼的程序,那麼需要 改動的地方就太大了。凡是涉及到字符操作的地方都需要改變。那麼 ,有沒有比較好的辦法不做更改 就可以用同樣的代碼編譯出ASCII版本的程序呢。  

當然有,就是我們在編程的時候盡量使用不帶後綴的宏定義,如上例,就使用MessageBox,其中的參 數也不明確使用char 還是wchar_t 而是使用微軟給我們定義的TCHAR字符數據類型,它的定義和上面 MessageBox函數的定義差不多,都是根據是否定義了UNICODE這個宏來判斷是將TCHAR定義為char還是 wchar_t,所以這樣一來,這個TCHAR的數據類型就是可變的了,它根據工程的設置而定義為相應的最終 字符類型,這樣我們的程序就可以不做任何更改就可以輕松的編譯出另外一個版本的了。是不是非常方 便。

前面2篇文章純文字的介紹比較多,因為很多是概念性的,需要理解,後面的文章我准備配合一些小 示例程序,使用一些簡單的API函數,遇到的相關的概念在一並介紹的方法進行。所以,前2篇文章如果 各位朋友不是很能理解,不用擔心,影響不是很大,經過後面的學習,你就會慢慢的理解前面所說的內 容了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved