欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

寬字符的介紹

系統 2666 0
[轉]寬字符的介紹
2009-04-28 10:51

轉自:http://dev.csdn.net/article/77757.shtm

2.2 寬字符和C

寬字符不一定是Unicode。Unicode是寬字符集的一種。然而,因為本書的焦點是Windows而不是C執行的理論,所以書中把寬字符和Unicode作為同義語。
2.2.1 char 數據類型
1)下面的語句定義并初始化了一個只包含一個字符的變量:
char c = 'A' ;
變量c需要1個字節來保存,并將用十六進位數0x41初始化,這是字母A的ASCII代碼。
(2)可以這樣定義一個指向字串的指針:
char * p ;
因為Windows是一個32位元作業系統,所以指針變量p需要用4個字節保存。還可初始化一個指向字串的指針:
char * p = "Hello!" ;
字串”Hello!”保存在靜態記憶體中并占用7個字節,其中6個字節保存字串,另1個字節保存終止符號0。
(3)可以這樣定義字符數組:
char a[10] ;
在這種情況下,編譯器為該數組保留了10個字節的儲存空間。運算式sizeof(a) 將返回10。
(4)如果數組是全體變量(即在所有函數外定義),您可使用像下面的語句來初始化一個字符數組:
char a[] = "Hello!" ;
(5)如果您將該數組定義為一個函數的區域變量,則必須將它定義為一個static變量,如下:
static char a[] = "Hello!" ;
無論哪種情況,字串都儲存在靜態程序記憶體中,并在末尾添加0,這樣就需要7個字節的儲存空間。
2.2.2??????? 寬字符
(1)Unicode或者寬字符都沒有改變char數據類型在C中的定義。
(2)C中的寬字符基於wchar_t數據類型,它在幾個頭文件包括WCHAR.H中都有定義,如下:
typedef unsigned short wchar_t ;
因此,wchar_t數據類型與無符號短整數型相同,都是16位寬。
(3)要定義包含一個寬字符的變量,可使用下面的語句:
wchar_t c = 'A' ;
變量c是一個雙字節值0x0041,是Unicode表示的字母A。( 然而,因為 Intel 微處理器從最小的字節開始儲存多字節數值,該字節實際上是以 0x41 0x00 的順序保存在記憶體中。如果檢查 Unicode 文字的電腦儲存應注意這一點。
(4)可定義指向寬字串的指針:
wchar_t * p = L"Hello!" ;
注意緊接在第一個引號前面的大寫字母L(代表「long」)。這將告訴編譯器該字串按寬字符保存——即每個字符占用2個字節。通常,指針變量p要占用4個字節,而字串變量需要14個字節-每個字符需要2個字節,末尾的0還需要2個字節。
(5)可以用下面的語句定義寬字符數組:
static wchar_t a[] = L"Hello!" ;
該字串也需要14個字節的儲存空間,sizeof (a) 將返回14。索引數組a可得到單獨的字符。a[1] 的值是寬字符「e」,或者0x0065。第一個引號和L兩個符號之間必須沒有空格。L使編譯器將字串存為每個字符2字節。
(6)可在單個字符文字前面使用L字首,來表示它們應解釋為寬字符。如下所示:
wchar_t c = L'A' ;
但通常這是不必要的,C編譯器會對該字符進行擴充,使它成為寬字符。
2.2.3??????? 寬字符程序庫函數
??????? strlen函數的寬字符版是wcslen( wide-character string length:寬字串長度 ),并且在STRING.H( 其中也說明了strlen )和WCHAR.H中均有說明。strlen函數說明如下:
size_t __cdecl strlen (const char *) ;
??????? 而wcslen函數則說明如下:
size_t __cdecl wcslen (const wchar_t *) ;
??????? 要得到寬字串的長度可以調用
wchar_t * pw = L"Hello!" ;
iLength = wcslen (pw) ;
??????? 函數將返回字串中的字符數6。 改成寬字節後,字串的字符長度不改變,只是字節長度改變了。
所有帶有字串參數的C執行時期程序庫函數都有寬字符版。例如,wprintf是printf的寬字符版。這些函數在WCHAR.H和含有標準函數說明的頭文件中說明。
2.2.4??????? 維護單一原始碼
??????? 使用Unicode最主要缺點是,程序中的每個字串都將占用兩倍的儲存空間。此外,寬字符執行時期程序庫中的函數比常規的函數大。
??????? 因此,就有必要建立兩個版本的程序——一個處理ASCII字串,另一個處理Unicode字串。最好的解決辦法是維護既能按ASCII編譯又能按Unicode編譯的單一原始碼檔案。
一個辦法是使用Microsoft Visual C++包含的TCHAR.H頭文件。( 該頭文件不是ANSI C標準的一部分,因此其中定義的每個函數和巨集定義的前面都有一條下橫線。
??????? TCHAR.H為需要字串參數的標準執行時期程序庫函數提供了一系列的替代名稱(例如,_tprintf和_tcslen)。有時這些名稱也稱為「通用」函數名稱,因為它們既可以指向函數的Unicode版也可以指向非Unicode版。
?????? 如果定義了名為_UNICODE的識別字,并且程序中包含了TCHAR.H頭文件,那么_tcslen就定義為wcslen:
#define _tcslen wcslen
????? 如果沒有定義UNICODE,則_tcslen定義為strlen:
#define _tcslen strlen
等等。
?????? TCHAR.H還用一個新的數據類型TCHAR來解決兩種字符數據類型的問題。如果定義了 _UNICODE識別字,那么TCHAR就是wchar_t:
typedef??? wchar_t??? TCHAR ;
?????? 否則,TCHAR就是char:
typedef char TCHAR ;
?????? 現在開始討論字串文字中的L問題。如果定義了_UNICODE識別字,那么一個稱作__T的巨集就定義如下:
#define __T(x) L##x
?????? 這是相當晦澀的語法,但合乎ANSI C標準的前置處理器規范。那一對井字號稱為「 粘貼符號(token paste) 」,它將字母L添加到巨集引數上。因此,如果巨集引數是"Hello!",則L##x就是L"Hello!"。
?????? 如果沒有定義_UNICODE識別字,則__T巨集只簡單地定義如下:
#define __T(x) x
?????? 此外,還有兩個巨集與__T定義相同:
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
在Win32 console程序中使用哪個巨集,取決於您喜歡簡潔還是詳細。基本地,必須按下述方法在_T或_TEXT巨集內定義字串文字:
_TEXT ("Hello!")
?????? 這樣做的話,如果定義了_UNICODE,那么該串將解釋為寬字符的組合,否則解釋為8位元的字符字串。

寬字符的介紹


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩在线无 | 亚洲精品国产偷自在线观看 | 久久精品国产免费中文 | wwwwww日本| 手机国产日韩高清免费看片 | 久久在线中文字幕 | 国产欧美精品一区二区三区 | 日韩精品久久 | 挑战者联盟第一季免费观看完整版 | 精品国产一区二区三区久久久久久 | 久久男人的天堂 | 九一免费国产 | 超级碰碰碰免费视频 | 色综合天天射 | 国产免费观看一级国产 | 中文字幕日韩在线 | 一级福利 | 免费观看一级特黄欧美大片 | 免费黄色大片在线观看 | 欧美亚洲精品一区 | 精品一区二区三区不卡 | 天天拍天天干天天操 | 午夜天堂精品久久久久 | 亚洲精品久久久久久一区 | 性福利影院 | 亚洲欧美综合日韩字幕v在线 | 国产男女交性视频播放 | 大伊香蕉在线观看视频 wap | 欧美性猛片| 玖操网 | 性久久久久久久久波多野结衣 | 国产99一区二区 | 久久伊人国产 | 碰碰碰精品视频在线观看 | 特色特色大片在线 | 综合色播| 欧美午夜性春猛交bbb | 午夜电影通| 欧美一区在线观看视频 | 亚洲毛片在线观看 | √新版天堂资源在线资源 |