2.2 字符
- 在传统的C语言里,字符(character)是指任意一个字节里的内容,是一个有特定含义的比特序列。由于这个比特序列至少需要用一个原子粒度的存储单元(也就是字节)来承载,所以,传统的C语言的"字符"是指单字节字符。
但是,随着C语言的国际化,一个大的问题显现出来:汉语、日语、韩语,甚至拉丁文化圈的文字一个字节不够,需要用多个字节来表示,这就引入了“多字节字符”和“宽字符”的概念。因此,如果从广义上来说,字符是信息的一个单位,文本数据由他们组成,通过他们,文本的内容得以展现和表示,同时他们又是对文本数据进行控制和处理的基本单位。
在这本书中,字符的含义取决于具体的上下文语境,有时指单字节字符,有时指多字节字符或者宽字符。
2.2.1 多字节字符
- 源字符集和执行字符集实际上都包括一个基本部分,或者说是一个子集,称为基本字符集。除此之外,他们还包括一些扩展字符。
扩展字符基本上都是各个国家和地区所使用的本地字符,因其数量庞大,一个字节无法表示,必须使用多个字节。
一旦决定对不同字符使用不同数量的字节,那么,源字符集和执行字符集中的成员都将需要一个或者多个字节表示。像这样,使用一个以上的字节来表示的字符被称为多字节字符。
典型的多字节字符是采用UTF-8编码方式表示的字符,他说Unicode和ISO/IEC 10646字符集的一种编码方式。
相对于传统的单字节符和宽字符,多字节字符更难处理,需要额外的算法和过程。想想看,如何在一个字节流中找出哪几个字节对应的某个字符的编码?但是,因为所有设备都是和”流“打交道的,而”流“的基本成分是字节,所以这也是多字节的优势所在。
2.2.2 宽字符
我们知道,有些国家和地区的文字比较简单,而有些国家和地区的文字很复杂,字符的数量很多。但是,与多字符不同,另一种表示字符的方式是采用统一的长度。
问题在于多长是合适的。不管多长,总的原则是能够表示当前所在国家和地区的所有本地字符。在C89中定义了一个新的类型wchar _t,他的宽度可以满足这个要求。wchar_t 是一种整型类型,在头文件<stddef.h>中定义,可能是这样的:
typedef unsigned short wchar_t;
因此,可以用wchar_t 类型的宽度作为参照,用这个宽度来表示的字符就是宽字符。
宽字符比多字符容易处理,通常用于程序和宿主环境内部的字符表示。问题在于 wchar_t 类型的宽度取决于C实现。比如,在有的平台上它是16位的,而在另一些平台上它是32位的。当程序要在不同的平台之间移植时,这会造成一些困扰。
为此,C11引入俩种更加明确的类型char16_t 和 char32_t ,他们是在头文件<uchar.h>中定义的,他们都是无符号整数类型,前者的宽度保证是16个比特,后者的宽度保证是32个比特。因此,宽字符既可以用wchar_t类型来表示,也可以用char16_t或者char32_t类型来表示。
注意:如果宽字符用wchar_t 类型来表示的,则他的编码方式取决于C实现;如果宽字符是用char16_t类型来表示的,且C实现预定义了值为1的宏_STDC_UTF_16__,则宽字符的编码方式是UTF-16,如果未定义这个宏,则宽字符的实际编码方式取决于C实现。
来源:CSDN
作者:New_Joker
链接:https://blog.csdn.net/New_Joker/article/details/103795782