天天看點

linux 寬字元串,C語言中的多位元組字元與寬字元

C語言原本是在英文環境中設計的,主要的字元集是7位的ASCII碼,8位的byte(位元組)是最常見的字元編碼機關。但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用一個位元組編碼。

C95标準化了兩種表示大型字元集的方法:寬字元(wide character,該字元集内每個字元使用相同的位長)以及多位元組字元(multibyte character,每個字元可以是一到多個位元組不等,而某個位元組序列的字元值由字元串或流(stream)所在的環境背景決定)。

自從1994年的增補之後,C語言不隻提供char類型,還提供wchar_t類型(寬字元),此類型定義在stddef.h 頭檔案中。wchar_t指定的寬位元組類型足以表示某個實作版本擴充字元集的任何元素。

在多位元組字元集中,每個字元的編碼寬度都不等,可以是一個位元組,也可以是多個位元組。源代碼字元集和運作字元集都可能包含多位元組字元。多位元組字元可以被用于字元的常量、字元串字面值(string literal)、辨別符(identifier)、注釋(comment),以及頭檔案。

C語言本身并沒有定義或指定任何編碼集合,或任何字元集(基本源代碼字元集和基本運作字元集除外),而是由其實作指定如何編碼寬字元,以及要支援什麼類型的多位元組字元編碼機制。

雖然C标準沒有支援Unicode字元集,但是許多實作版本使用Unicode轉換格式UTF-16和UTF-32來處理寬字元。如果遵循Unicode标準,wchar_t類型至少是16或32位長,而wchar_t類型的一個值就代表一個Unicode字元。

UTF-8是一個由Unicode CONsortium(萬國碼聯盟)定義的實作,可以表示Unicode字元集的所有字元。UTF-8字元所使用的空間大小從一個位元組到四個位元組都有可能。

多位元組字元和寬字元(也就是wchar_t)的主要差異在于寬字元占用的位元組數目都一樣,而多位元組字元的位元組數目不等,這樣的表示方式使得多位元組字元串比寬字元串更難處理。比方說,即使字元'A'可以用一個位元組來表示,但是要在多位元組的字元串中找到此字元,就不能使用簡單的位元組比對,因為即使在某個位置找到相符合的位元組,此位元組也不見得是一個字元,它可能是另一個不同字元的一部分。然而,多位元組字元相當适合用來将文字存儲成檔案。

C提供了一些标準函數,可以将多位元組字元轉換為wchar_t,或将寬字元轉換為多位元組字元。比方說,如果C 編譯器使用Unicode 标準的UTF-16 和UTF-8,那麼下面調用wctomb()函數就可以獲得字元的多位元組表示方式(注:wctomb = wide character to multibyte)。

linux 寬字元串,C語言中的多位元組字元與寬字元