在c語言中,使用wchar.h
標頭檔案中的wchar_t
來定義寬字元,例如:
wchar_t ch = 'a';
wchar_t 被定義為typedef unsigned short wchar_t
,和乙個無符號整型一樣,占用兩個位元組。
如果定義寬字串,需要加字首l
,例如:
wchar_t *str = l"c語言中文網";
l
是必須要加的,並且與字串之間不能有空格,只有這樣編譯器才知道每個字元占用兩個位元組。寬字元示例:
#include #include int main()
執行結果:
ch=1, wch=2, str=12, wstr=14
wstr 之所以比 str 多兩個位元組是因為:字元 'c' 占用兩個位元組,字串結束標誌 '\0' 也占用兩個位元組。
計算ascii字串長度使用 strlen 函式,計算寬字串長度使用 wcslen 函式:
#include #include #include int main()
執行結果:
strlen(str)=11, wcslen(wstr)=6
strlen 的執行結果顯然不正確,因為它把乙個位元組作為乙個字元計算,而 wcslen 把兩個位元組作為乙個字元計算。
注意:wcslen 在 string.h 和 wchar.h 標頭檔案中均有說明在 windows nt 以前的作業系統中,甚至包括 windows 98,對寬字元的支援都不是很好,所以大多情況下使用ascii編碼。windows nt 推出以後,已經從底層支援了unicode,所以在 windows nt 上的程式大多使用unicode。
如果你希望程式能夠在各種版本的windows作業系統中執行,那麼就需要維護兩個版本的源**,ascii 版和 unicode 版。ascii 字元和 unicode 字元的定義、使用都不一樣,要想在乙個版本的源**中做相容處理會非常困難,要做大量的工作,對程式設計師來說簡直是噩夢。
不過,windows 又為我們做了一件好事,已經處理了相容性問題。它是怎麼做到的呢?
例如對於字串,ascii 中使用 char 來定義,而 unicode 中使用 wchar_t 來定義,並且需要新增字首l
。那麼在 windows.h 標頭檔案中(或者是它包含的其他標頭檔案)就這樣來處理:
#ifdef unicode
typedef wchar_t tchar;
#define text(quote) l##quote
#else
typedef char tchar
#define text(quote) quote
#endif
我們在原始碼中可以這樣來使用:
tchar str = text("c語言中文網");
如果是unicode版,也就是定義了unicode巨集,那麼上面的語句等價於:
wchar_t str = l"c語言中文網";
如果是ascii,也就是沒有定義unicode巨集,那麼等價於:
char str = "c語言中文網";
在windows中,隨處可見這樣的處理。雖然現代作業系統都已經支援unicode,無需再考慮與ascii的相容性問題,但是依然要為這些歷史問題付出代價。
總結:由於各種各樣的原因,我們優先使用windows定義的資料型別、巨集、結構體等,這樣編寫的程式相容性較好,不用考慮ascii和unicode的問題。但這也帶來了乙個挑戰,就是要熟悉window定義的資料型別、巨集、結構體等。
寬字元與Unicode
在c語言中,我們使用char來定義字元,占用乙個位元組,最多只能表示128個字元,也就是ascii碼中的字元。計算機起源於美國,char 可以表示所有的英文本元,在以英語為母語的國家完全沒有問題。但是世界上存在很多不同的語言,例如漢語 漢語 日語等有成千上萬個字元,需要用多個位元組來表示,稱之為 寬...
C語言中的多位元組字元與寬字元
c語言原本是在英文環境中設計的,主要的字符集是7位的ascii碼,8位的byte 位元組 是最常見的字元編碼單位。但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用乙個位元組編碼。c95標準化了兩種表示大型字符集的方法 寬字元 wide character,該字符集內每個字元使用相同...
多位元組字元與寬字元
多位元組字符集 每個字元的編碼寬度不一,可為乙個位元組或多個位元組。1 ascii字元只佔乙個位元組 2 對於中文 日文等用兩個位元組 3 乙個字串中,如何區分哪個是中文字元,那個是ascii字元呢?windows程式設計 16進製制 10進製 的編碼wi ndow s程式設 計6e6fb3 cc ...