Windows下寬字元集與char

來源:互聯網
上載者:User

 

我們都知道如何獲得字串的長度。例如,如果我們已經像下面這樣定義了一個字串指標:

char * pc = "Hello!" ;

我們可以呼叫

iLength = strlen (pc) ;

這時變數iLength將等於6,也就是字串中的字元數。

太好了!現在讓我們試著定義一個指向寬字元的指標:

wchar_t * pw = L"Hello!" ;

再次呼叫strlen :

iLength = strlen (pw) ;

現在麻煩來了。首先,C編譯器會顯示一條警告訊息,可能是這樣的內容:

'function' : incompatible types - from 'unsigned short *' to 'const char *'

這條訊息的意思是:聲明strlen函數時,該函數應接收char類型的指標,但它現在卻接收了一個unsigned short類型的指標。您仍然可編譯並執行該程式,但您會發現iLength等於1。為什嗎?

字串「Hello!」中的6個字元佔用16位:

0x0048 0x0065 0x006C 0x006C 0x006F 0x0021

Intel處理器在記憶體中將其存為:

48 00 65 00 6C 00 6C 00 6F 00 21 00

假定strlen函數正試圖得到一個字串的長度,並把第1個位元組作為字元開始計數,但接著假定如果下一個位元組是0,則表示字串結束。

這個小練習清楚地說明了C語言本身和執行時期連結庫函數之間的區別。編譯器將字串L"Hello!" 解釋為一組16位短整數型態資料,並將其儲存在wchar_t數組中。編譯器還處理數組索引和sizeof操作符,因此這些都能正常工作,但在連結時才添加執行時期連結庫函數,例如strlen。這些函數認為字串由單位元組字元組成。遇到寬字元串時,函數就不像我們所希望那樣執行了。

您可能要說:「噢,太麻煩了!」現在每個C語言連結庫函數都必須重寫以接受寬字元。但事實上並不是每個C語言連結庫函數都需要重寫,只是那些有字串參數的函數才需要重寫,而且也不用由您來完成。它們已經重寫完了。

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 *) ;

這時我們知道,要得到寬字元串的長度可以呼叫

iLength = wcslen (pw) ;

函數將返回字串中的字元數6。請記住,改成寬位元組後,字串的字元長度不改變,只是位組長度改變了。

您熟悉的所有帶有字串參數的C執行時期連結庫函數都有寬字元版。例如,wprintf是printf的寬字元版。這些函數在WCHAR.H和含有標準函數說明的表標頭檔中說明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.