(1)概念
位(bit):数据存储的最小单位。位,简记为b,也称为比特,每个0或1就是一个位(bit)。计算机中的CPU位数指的是CPU一次能处理的最大位数。
字节(Byte):8 bit就称为一个字节(Byte)。
(2)ASCII(美国信息交换标准代码,AmericanStandard Code for Information Interchange)
如今使用的所说的ASCII码实际是由基础ASCII和扩展ASCII(IBM扩展字符集)组成的。
基础ASCII又称标准ASCII,使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符,总共有128个。但是ASCII码是用一个字节来存放的,一个字节是8位,多余一位用作检查编码出错的奇偶较验位。
扩展ASCII码是在原有的7位上加了一位,变成8位,形成扩展ASCII字符集。扩展ASCII字符集包含2^8=256个字符,并且其中的前128个字符与原来的ASCII字符集相同(就是原来的ASCII字符集的7位编码前面加一个0),而后面128个字符高位都是1。后128个字符用来表示附加的128个特殊符号字符、外来语字母和图形符号。
(3)Unicode
Unicode中每个字符都是16位宽,可以代表2^16=25536个字符。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。但是值得注意的是Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以Unicode有了不同的编码方式,包括UTF-8、UTF-16、UTF-32等。Unicode中每个字符都是16位宽,所以8位的值在Unicode中是没有意义的。
(4)ANSI编码(AmericanNational Standards Institute,美国国家标准学会的标准码)
ANSI码:为使计算机支持更多语言,通常使用0x80~0xFF(即128 - 256)范围的 2个字节来表示 1个字符。比如:汉字'中'在中文操作系统中,使用 [0xD6,0xD0]这两个字节存储。对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode(UTF-16)编码之间最大也最明显的区别。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表GB2312 编码,在日文操作系统下,ANSI编码代表 JIS编码。不同 ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 当然对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。
(5)双字节字符集(DBCS)
最初的128个代码是ASCII,较高的128个代码中的某些总是跟随著第二个位元组。这两个位元组一起(称作首位元组和跟随位元组)定义一个字元,通常是一个复杂的象形文字。
Unicode使用(特别在C程式设计语言环境里)宽字元集。Unicode中的每个字元都是16位元宽而不是8位元宽。在Unicode中,没有单单使用8位元数值的意义存在。相比之下,在双位元组字元集中我们仍然处理8位元数值。有些位元组自身定义字元,而某些位元组则显示需要和另一个位元组共同定义一个字元。
ASCII、ANSI、DBCS中两个字节存储的字符,它们的两个字节都可以分解,可以代表不同的意思,合起来才代表一个字符。
Unicode中单个字节是没有意义的,它的最基本的字符都有16位宽。
初识编码,有写的不对的地方,请指证。