C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码.从此开始,8位的byte(字节)变成最常见的字符编码单位,但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码,于是世界上使用各式各样多字节的字符编码集合已经数十年了,比如用来表示"非拉丁字母"以及"非字母"的中,日,韩文字系统.在1994年,"Normative Addendum1"(基准增补一)的采用,让ISO C可以标准化两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte chatacter,每个字符可以是一到多个字节不等,而某个字节序列的字符的字符值由字符串或流(stream)所在的环境背景决定). 注意:虽然C现在提供抽象机制,可以处理和转换不同种类的编码集合,但语言本身并没有定义或指定任何编码集合,或任何字符集. 自从1994年的增补之后,C不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h头文件中.wchar_t类型足以表示某个实现版本扩展字符集的任何元素. 虽然C标准没有支持Unicode字符集,许多实现版本使用Unicode转换格式UTF-16和UTF-32(参考http://www.unicode.org)来处理宽字符.Unicode标准和ISO/IEC 10646标准相当接近,而且是许多既有字符集(包括7位的ASCII)的超集.如果遵循Unicode标准,wchar_t类型至少是16或32位长,而wchar_t类型的一个值就代表一个Unicode字符.比方说,下列的定义将变量wc初始化为希腊字母a. wchar_t wc = '\x3b1'; 此转义符以"\x"起头,后面接着十六进制的数字,会将这个数字所代表的字符赋值到变量中.在这个例子中,此字符是小写的alpha 在多字节字符集中,每个字符的编码宽度都不等,可以是一个字节,可以是一个字节,也可以是多个字节.源代码字符集和运行字符集都可能包含多字节字符,如果真的包含多字节字符的话,那么基本字符集中的每个字符都只会占用一个字节(完全没有多字节的字符),空字符是唯一的例外,空字符可能会占用任意个数的字节(但这些字节内全部的位都必须是0).多字节字符可以被用于字符的常量,字符串字面值,标识符,注释,以及头文件.许多的多字节字符集被设计来支持特定国家语言,例如JIS字符集(日本业界标准).多字节UTF-8字符集是由Unicode Consortium(万国码联盟)定义的,可以表示Unicode字符集的所有字符.UTF-8字符所使用的空间大小从一个字节到四个字节都有可能. 多字节字符和宽字符(也就是wchar_c)的主要差异在于宽字符占用的字节数目都一样,而多字节字符的字节数目不等,这样的表示方式使得多字节字符串比宽字符串更难处理.比方说,即使字符'A'可以用一个字节来表示,但是要在多字节的字符串中找到此字符,就不能使用简单的字节比对,因为即使在某个位置找到相符合的字节,此字节也不见得是一个字符,它可能是另一个不同字符的一部分.然而,多字节字符相当适合用来将文字储存成文件. C提供了一些标准函数,可以将多字节字符转换为wchar_t,或将宽字符转换为多字节字符.比方说,如果C编译器使用Unicode标准的UTF-8和UTF-16,那么下面调用wctomb()函数就可以获得字符a的多字节表示方式(注:wctomb=wide character to multibyte).
wchar_t wc=L'\x3B1';
char mbStr[10]=" ";
int bBytes=0;
nBytes=wctomb(mbStr,wc);
在调用此函数之后,mbStr数组会得到多字节的字符,在这个例子中,也就是"\XCE\XB1"符号.此函数返回值是"所需要的字节个数",在这个例子中,被赋值到变量nByptes的值是2,意思是:希腊小写字母alpha在多字节中需要占两个字符.