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

2021-09-08 03:42:41 字數 1197 閱讀 9867

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

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

自從2023年的增補之後,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)。

多位元組字元與寬字元

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

C 多位元組字元與寬位元組字元相互轉換

pragma once class strtransfer 字元型別 wchar t char 獲取字元長度 wcslen strlen 連線兩個字串 wcscat strcpy 複製字串 wcscpy strcpy 比較兩個字串 wcscmp strcmp 具體引數詳見www.linuxidc.c...

C C 多位元組字元與寬字元的輸出

使用c 標準庫的iostream,可以方便地將控制台 檔案 字串以及其它可擴充的外部表示作為流來處理,但要處理中文,卻會碰到很多問題。本人原來沒怎麼用過這個iostream,這幾天嘗試用這個寫點東西,一會兒不能輸出中文,一會兒不支援中文檔名的,搞得頭大。網上搜了搜,沒有發現適用於所有情況的解決方案。...