ansi c也支援多位元組字符集,例如中文、日文和韓文版本windows支援的字符集。然而,這些多位元組字符集被當成單位元組構成的字串看待,只不過其中一些字元改變了後續字元的含義而已。多位元組字符集主要影響c語言程式執行時期鏈結庫函式。相比之下,寬字元比正常字元寬,而且會引起一些編譯問題。
寬字元不需要是unicode。unicode是一種可能的寬字符集。然而,因為本書的焦點是windows而不是c執行的理論,所以我將把寬字元和unicode作為同義語。
char資料型態
假定我們都非常熟悉在c程式中使用char資料型態來定義和儲存字元跟字串。但為了便於理解c如何處理寬字元,讓我們先回顧一下可能在win32程式中出現的標準字元定義。
下面的語句定義並初始化了乙個只包含乙個字元的變數:
char c = 'a' ;
變數c需要1個位元組來儲存,並將用十六進製制數0x41初始化,這是字母a的ascii**。
您可以像這樣定義乙個指向字串的指標:
char * p ;
因為windows是乙個32位作業系統,所以指標變數p需要用4個位元組儲存。您還可初始化乙個指向字串的指標:
char * p = "hello!" ;
像前面一樣,變數p也需要用4個位元組儲存。該字串儲存在靜態記憶體中並占用7個位元組-6個位元組儲存字串,另1個位元組儲存終止符號0。
您還可以像這樣定義字元陣列:
char a[10] ;
在這種情況下,編譯器為該陣列保留了10個位元組的儲存空間。表示式sizeof(a)將返回10。如果陣列是整體變數(即在所有函式外定義),您可使用像下面的語句來初始化乙個字元陣列:
char a = "hello!" ;
如果您將該陣列定義為乙個函式的區域變數,則必須將它定義為乙個static變數,如下:
static char a = "hello!" ;
無論哪種情況,字串都儲存在靜態程式記憶體中,並在末尾新增0,這樣就需要7個位元組的儲存空間。
寬字元
unicode或者寬字元都沒有改變char資料型態在c中的含義。char繼續表示1個位元組的儲存空間,sizeof (char)繼續返回1。理論上,c中1個位元組可比8位長,但對我們大多數人來說,1個位元組(也就是1個char)是8位寬。
c中的寬字元基於wchar_t資料型態,它在幾個表頭檔案包括wchar.h中都有定義,像這樣:
typedef unsigned short wchar_t ;
因此,wchar_t資料型態與無符號短整數型態相同,都是16位寬。
要定義包含乙個寬字元的變數,可使用下面的語句:
wchar_t c = 'a' ;
變數c是乙個雙位元組值0x0041,是unicode表示的字母a。(然而,因為intel微處理器從最小的位元組開始儲存多位元組數值,該位元組實際上是以0x41、0x00的順序儲存在記憶體中。如果檢查unicode文字的計算機儲存應注意這一點。)
您還可定義指向寬字串的指標:
wchar_t * p = l"hello!" ;
注意緊接在第乙個引號前面的大寫字母l(代表「long」)。這將告訴編譯器該字串按寬字元儲存-即每個字元占用2個位元組。通常,指標變數p要占用4個位元組,而字串變數需要14個位元組-每個字元需要2個位元組,末尾的0還需要2個位元組。
同樣,您還可以用下面的語句定義寬字元陣列:
static wchar_t a = l"hello!" ;
該字串也需要14個位元組的儲存空間,sizeof (a) 將返回14。索引陣列a可得到單獨的字元。a[1] 的值是寬字元「e」,或者0x0065。
雖然看上去更像乙個印刷符號,但第乙個引號前面的l非常重要,並且在兩個符號之間必須沒有空格。只有帶有l,編譯器才知道您需要將字串存為每個字元2位元組。稍後,當我們看到使用寬字串而不是變數定義時,您還會遇到第乙個引號前面的l。幸運的是,如果忘記了包含l,c編譯器通常會給提出警告或錯誤資訊。
您還可在單個字元文字前面使用l字首,來表示它們應解釋為寬字元。如下所示:
wchar_t c = l'a' ;
但通常這是不必要的,c編譯器會對該字元進行擴充,使它成為寬字元。
寬字元wchar t和窄字元char區別和相互轉換
1.首先,說下窄字元char了,大家都很清楚,就是8bit表示的byte,長度固定。char字元只能表示asii碼表中的256個字元,包括前128個可見字元和後面的128個不可見字元。而wchar t則是因為char所能表示的字元數太少 256個 而應運而生的,它的長度可以8bit,16bit,32...
寬字元和窄字元
關於寬字元和窄字元之間的區別,以及為什麼當我們採用printf和char 的時候可以輸出乙個中文字元,大概是因為預設情況下的編碼方式是utf 8的編碼方式。具體的可以參考這兩篇部落格 關於寬字元和窄字元 和 關於寬字元 unicode或者寬字元都沒有改變char資料型態在c中的含義。char繼續表示...
寬字元和多位元組字元(mbtowc wctomb)
c 語言原本是在英文環境中設計的,主要的字符集是7 位的ascii 碼。從此開始,8 位的byte 位元組 變成最常見的字元編碼單位,但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用乙個位元組編碼,於是世界上使用各式 各樣多位元組的字元編碼集合已經有數十年了,比如用來表示 非拉丁字...