API入門系列之二 Unicode還是ASCII

2021-06-01 22:07:47 字數 1765 閱讀 1852

首發:

不知道各位新手朋友們遇到這樣的問題沒有呢,新建乙個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的資料型別就是可變的了,它根據工程的設定而定義為相應的最終字元型別,這樣我們的程式就可以不做任何更改就可以輕鬆的編譯出另外乙個版本的了。是不是非常方便。

LaTeX入門系列之二 LaTeX教程

不管是ctex還是chinatex論壇,很多tex前輩和使用者都給大家提供了很多諮詢幫助,同時,也分享了很多很多學習上的方法與技巧。一般都推薦入門的使用者先閱讀一本入門書,掌握基本的知識,然後再進行各方面知識的擴充套件學習,這裡介紹這些年來所出版的latex書籍,讀者可以根據需要進行選擇閱讀。國內出...

hibernate系列之二

首先先介紹一下持久化 持久化 將程式資料在持久狀態和瞬時狀態間轉換的機制 即將記憶體的資料永久存在關係型資料庫中 持久化類的編寫規則 持久化類需要提供無參構造方法 持久化類的屬性需要私有,對私有的屬性提供get set方法 持久化類的屬性盡量使用包裝類的型別 持久化類要有乙個唯一標識oid與表的主鍵...

Asp元件初級入門與精通系列之二

如何註冊元件 1 regsvr32 元件的絕對路徑 如 regsvr32 c estfc1.dll 因為元件只要註冊就可以使用了,所以與元件的位置無關。2 在com 元件管理器中註冊。什麼時候需要這種註冊 元件在使用了com 的服務後需要註冊後才能正常的執行。如果該元件僅僅regsvr32註冊,仍然...