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)。