天天看點

C語言中寬字元和多位元組字元

C 語言原本是在英文環境中設計的,主要的字元集是7 位的ASCII 碼。從此開始,8 位的byte(位元組)變成最常見的字元編碼機關,但是國際化軟體必須能夠表示不同的字元,而這些字元數量龐大,無法使用一個位元組編碼,于是世界上使用各式 各樣多位元組的字元編碼集合已經有數十年了,比如用來表示“非拉丁字母”以及“非字母”的中、日、韓文字系統。在1994 年,“Normative Addendum 1”(基準增補一)的采用,讓ISO C 可以标準化兩種表示大型字元集的方法:寬字元(wide

character,該字元集内每個字元使用相同的位長)以及多位元組字元(multibyte character,每個字元可以是一到多個位元組不等,而某個位元組序列的字元值由字元串或流(stream)所在的環境背景決定)。

注 意: 雖然C現在提供抽象機制,可以處理和轉換不同種類的編碼集合,但語言本身并沒有定義或指定任何編碼集合,或任何字元集(除前一節提到的基本源代碼字元集和 基本運作字元集外)。換句話說,這部分是由個别的實作版本指定如何編碼寬字元,以及要支援什麼類型的多位元組字元編碼機制。

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

字元。比方說,下列的定義将變量wc 初始化為希臘字母α。

此 轉義符以“"x”起頭,後面接着十六進制的數字,會将這個數字所代表的字元指派到變量中。在這個例子中,此字元是小寫的alpha。在多位元組字元集中,每 個字元的編碼寬度都不等,可以是一個位元組,也可以是多個位元組。源代碼字元集和運作字元集都可能包含多位元組字元,如果真的包含多位元組字元的話,那麼基本字元 集中的每個字元都隻會占用一個位元組(完全沒有多位元組的字元),空字元是唯一的例外,空字元可能會占用任意個數的位元組(但這些位元組内全部的位都必須為0)。 多位元組字元可以被用于字元的常量、字元串字面值(string

literal)、辨別符(identifier)、注釋(comment),以及頭檔案。許多的多位元組字元集被設計來支援特定國家的語言,例如JIS 字元集(日本業界标準,Japanese Industrial Standard)。多位元組UTF-8 字元集是由Unicode Consortium(萬國碼聯盟)定義的,可以表示Unicode 字元集的所有字元。

UTF-8 字元所使用的空間大小從一個位元組到四個位元組都有可能。多位元組字元和寬字元(也就是wchar_t)的主要差異在于寬字元占用的位元組數目都一樣,而多位元組字元的位元組數目不等,這樣的表示方式使得多位元組字元串比寬字元串更難處理。

比 方說,即使字元'A'可以用一個位元組來表示,但是要在多位元組的字元串中找到此字元,就不能使用簡單的位元組比對,因為即使在某個位置找到相符合的位元組,此字 節也不見得是一個字元,它可能是另一個不同字元的一部分。然而,多位元組字元相當适合用來将文字存儲成檔案(參見第13 章)。

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

在調用此函數之後,mbStr數組會得到多位元組的字元,在這個例子中,也就是""xCE"xB1"符号。此wctomb()函數的傳回值是“所需要 的位元組個數”,在這個例子中,被指派到變量nBytes 的值是2,意思是:希臘小寫字母alpha 在多位元組字元中需要占用兩個位元組。

繼續閱讀