寬字元和多位元組字元(mbtowc wctomb)

2021-06-20 03:27:39 字數 2017 閱讀 4951

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 型別足以表示某個實現版本擴充套件字符集的任何元素。

雖然c 標準沒有支援unicode 字符集,許多實現版本使用unicode 轉換格式utf-16 和utf-32(參考 來處理寬字元。unicode 標準和iso/iec 10646標準相當接近,而且是許多既有字符集(包括7 位的ascii)的超集。如果遵循unicode標準,wchar_t型別至少是16或32位長,而wchar_t型別的乙個值就代表乙個unicode 字元。比方說,下列的定義將變數wc 初始化為希臘字母α。

wchar_t wc = '"x3b1';

此 轉義符以「"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)。

wchar_t wc = l'"x3b1'; // 小寫的希臘字母alpha,α

char mbstr[10] = "";

int nbytes = 0;

nbytes = wctomb( mbstr, wc );

在呼叫此函式之後,mbstr陣列會得到多位元組的字元,在這個例子中,也就是""xce"xb1"符號。此wctomb()函式的返回值是「所需要 的位元組個數」,在這個例子中,被賦值到變數nbytes 的值是2,意思是:希臘小寫字母alpha 在多位元組字元中需要占用兩個位元組。

多位元組字元與寬字元

多位元組字符集 每個字元的編碼寬度不一,可為乙個位元組或多個位元組。1 ascii字元只佔乙個位元組 2 對於中文 日文等用兩個位元組 3 乙個字串中,如何區分哪個是中文字元,那個是ascii字元呢?windows程式設計 16進製制 10進製 的編碼wi ndow s程式設 計6e6fb3 cc ...

寬位元組字符集和多字符集

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

多位元組字符集和寬位元組字符集區別

多位元組字符集 字元編碼可能是1個位元組 也可能是2個位元組 ascii碼占用1個位元組儲存 中文 unicode 等 占用2個位元組 it學吧 16進製制編碼 73 84 47 89 80 55 0 16進製制最高位為1 代表負數 當存在負數則會把兩個負數當做乙個中文字元 73 i 1位元組 84...