寬字元與Unicode

2021-07-13 17:58:52 字數 2288 閱讀 3081

在c語言中,我們使用char來定義字元,占用乙個位元組,最多只能表示128個字元,也就是ascii碼中的字元。計算機起源於美國,char 可以表示所有的英文本元,在以英語為母語的國家完全沒有問題。

但是世界上存在很多不同的語言,例如漢語、漢語、日語等有成千上萬個字元,需要用多個位元組來表示,稱之為

寬字元(wide character)

。unicode 是寬字元編碼的一種,已經被現代計算機指定為預設的編碼方式,windows 2000以後的作業系統,包括windows 2000、xp、vista、win7、win8、win10、windows phone、windows server 等(它們統稱為 windows nt)都從底層支援unicode,訪問效率比 char 要高。

ascii編碼與unicode編碼

在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

intmain

()

執行結果:

ch=1, wch=2, str=12, wstr=14

wstr 之所以比 str 多兩個位元組是因為:字元 'c' 占用兩個位元組,字串結束標誌 '\0' 也占用兩個位元組。計算ascii字串長度使用 strlen 函式,計算寬字串長度使用 wcslen 函式:

#include

#include

#include

intmain

()

執行結果:

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 寬位元組字符集

unicode 寬位元組字符集 1.如何取得乙個 既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫 microsoft visual c 的執行期庫包含函式 mbslen 來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫 strlen 函式,無法真正了解字串中究竟有多少字元,它...

寬字符集(unicode)操作函式

寬字元函式 普通c函式 描述 iswalnum isalnum 測試字元是否為數字或字母 iswalpha isalpha 測試字元是否是字母 iswcntrl iscntrl 測試字元是否是控制符 iswdigit isdigit 測試字元是否為數字 iswgraph isgraph 測試字元是否...

寬字符集(unicode)操作函式

字元分類 寬字元函式 普通c函式 描述iswalnum isalnum 測試字元是否為數字或字母 iswalpha isalpha 測試字元是否是字母 iswcntrl iscntrl 測試字元是否是控制符 iswdigit isdigit 測試字元是否為數字 iswgraph isgraph 測試...