现在的位置: 首页 > 综合 > 正文

C核心技术手册(六)

2017年09月06日 ⁄ 综合 ⁄ 共 1252字 ⁄ 字号 评论关闭

1.1.1    宽字符和多字节字符

  C语言最初是在英文环境下发展而成,所以最初使用的是7位的ASCII编码字符集,其后,8位的字节变成最普遍的字符编码单位,但软件的国际化因素要求不能仅使用一个字节的字符编码方式,大量的不同与拉丁字母的多字节编码模式早已存在数十年,例如汉字、日文、韩文等。1994年,ISO C标准组织在“标准化附录1”中定义了两种大字符集:宽字符和多字节字符(一个字符可以使用一个或多个字节表示)

  自从1994年的附录开始,C不仅提供char类型,而且还提供宽字节字符wchar_t,这种类型定义在头文件stddef.h中,此文件足够大,以至于可以表示任意扩展字符集。

  尽管C标准没有要求支持Unicode字符集,但一些软件为了支持宽字符而使用Unicode的转化格式UTF-16UTF-32,Unicode标准与ISO/IEC10646标准一致,它是其他已存在字符集的超集,包括7位的ASCII字符。当Unicode标准执行时,wchar_t类型的宽度至少为1632,一个whchar_t类型的值表示一个Unicode字符,例如,下面的定义将变量wc初始化为希腊字母a

  wchar_t wc = ‘/x3b1’;

编码顺序以/x开始表示在变量中以十六进制存储,这个值为小写的希腊字母首字母。

  在多字节字符集中,一个字符以一个或多个字节来编码,源字符集和执行时字符集均可能包含多字节字符。如果这样,基本字符集中的每个字符仅占用一个字节,除了null字符可能多个位全为0的字节表示外,没有多字节字符集。多字节字符可以被使用在字符常量、字符串、注释和文件名中,许多多字节字符集被设计用来支持某一种语言,例如日本工业标准字符集(JIS),Unicode协会制定的UTF-8字符集,可以给分所有的Unicode字符,它使用14 个字节来表示一个字符。

  多字节字符和宽字符(即:wchar_t类型的字符)的主要区别在于:宽字符均为相同的大小,但多字节由变长的字节数来表示。这种表示使用多字节字符串被宽字节字符串处理起来要复杂的多,例如,字符’A’ 可以由单个字节表示。在一个多字节字符串中查找它比一个字节一个字节比较复杂,多字节字符适合保存文件内容。但是,C提供标准函数获取任意多字节字符的wchar_t值,并将任意的宽字符转换为它对应的多字节表示。例如,假设C编译器使用Unicode标准UTF-16UTF-8,下面通过调用函数wctomb() (即:wide character to multibyte)来获取字母a的多字节表示。

 

  函数被调用后,数组mbStr中存储了多字节字符,值为”/Xce/Xb1”,函数wctomb()的返回值赋值给变量nBytes, 它为转化后多字节字符所占的字节数,即2

 

抱歉!评论已关闭.