总结
ASCII 码 | Unicode | UTF-8 | GBK/GB18030 | |
---|---|---|---|---|
产生 | 从文字、图像等到计算机的0/1处理方式的编码 | ASCII码支持的字符过少,Unicode产生 | 解决Unicode的缺陷,针对Unicode的可变长编码方式 | ASCII码不支持中文,解决中文编码问题 |
字节 | 1个字节 | 2个字节 | 1-4个字节,可变长 | |
字符占位 | 一个字符占1个字节 | 一个字符占2个字节 | 英文占1个字节汉字占3个字节 | 英文1个字节,中文2个字节 |
ASCII码
在计算机中无论任何数据的传输、存储、持久化,都是以二进制的形式体现的。
ASCII由来
人类只认识文字,计算机只认0和1,产生了从文字到0、1的映射
- 文字----> 0/1:编码
- 0/1---->文字:解码
计算机只能处理0、1,如果需要处理文字,要先将文字转成数字。最早的计算机将8个比特(bit)作为一个字节(byte)
一个字节一共可以用来表示256(2的8次方)种不同的状态,每一个状态对应一个符号,就是256个符号,从
00000000
到11111111
。0-255之间用来表示英文字母,数字和一些符号,这个编码就是ASCII码ASCII 码一共规定了128个字符的编码,比如空格
SPACE
是32(二进制00100000
),大写的字母A
是65(二进制01000001
)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0
。
ASCII码是8位表示一个字符
奇偶校验
ASCII 码采用指定 7 位或 8 位二进制组合来表示 128 或 256 种字符。奇偶校验表示的是一个字节中1的个数必须是奇数或者偶数个。
7 位 ASCII 码 | 8 位 ASCII 码 | |
---|---|---|
名称 | 基础 ASCII 码 | 基础 ASCII 码 扩展 ASCII 码(后 128 个) |
范围 | 0x00 - 0x7F (0 - 127) | 0x00 - 0xFF(0 - 255) |
说明 | 理论上只用到 7 位,一个字节的最高位有特殊用途(不一定为 0) | 前面 128 个兼容 7 位 ASCII,在 7 位基础上最高位补 0 |
标准 ASCII 码:标准 ASCII 码每个字符采用 8 bit(1 byte)传输,在 7 位 ASCII 码基础上,最高位用于奇偶校验。
奇校验:代码一个字节中 1 的个数必须是奇数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 0;如果 7 位中有偶数个 1,最高位补 1。
偶校验:代码一个字节中 1 的个数必须是偶数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 1;如果 7 位中有偶数个 1,最高位补 0。
Unicode
Unicode由来
由于计算机一开始是老外发明的, 英文字母只用一个字节表示 ,没有将其他国家的字符考虑进去,所以其他国家有了自己的编码:中国制定了
GB2312
( 使用两个字节表示一个汉字 ),日本和韩国等也有了自己的编码。世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。如果有一种编码,将世界上所有的符号都纳入其中, 就可以统一全球所有语言的所有字符 。
为了统一标准,通用字符集(Universal Character Set, UCS)制定了两种标准字符集: UCS-2 、UCS-4
。分别表示 2 个字节定长字符编码和 4 个字节定长字符编码。
Unicode
编码采用 2 字节(16 bit)表示一个字符,对于以前的 ASCII
码则高字节全部补 0 进行处理。
总结:Unicode解决的是ASCII只能表示少量字符(256个,2的8次方)的问题。Unicode编码采用2个字节(16bit)表示一个字符
Unicode缺点
- 和ASCII码不完全兼容,对于比较老的ASCII文件,无法区分是ASCII码还是Unicode文件
- 最多支持65536个字符(2的16次方,16位)能够支持的字符仍然是比较少的,不能囊括全球所有国家的字符
- 采用UCS-4的4字符定长编码,可以囊括更多的字符,但是浪费了更多的空间。
UTF
Unicode为每个字符发了一张类似身份证的数字ID,这个ID号在世界上具有唯一性,起名为码点
。UTF,Unicode Transformation Formats
,Unicode转换格式,是为了解决码点在计算机中的存储方式而设计的。
码点经过映射后得到的二进制串的转换格式称之为码元
,code unit
码点是一串二进制数,码元就是切分这个二进制数的方法
如果一个字符的码点二进制有n个字节(n*8个二进制),其码元为8位,则其拥有n个码元
- utf-8:每读码点的8位代表一个字符
- utf-16:每读码点的16位代表一个字符
- utf-32:每读码点的32位代表一个字符
UTF-32
每32位去读一个码点。它的码元是32
位,每一个 UTF-32
值都可以直接表示对应的码点。 UTF-32(字符用四个字节表示),UTF-8, UTF-16
同理。
UTF-8
由来
UTF-8(8-bit Unicode Transformation Format)
是一种针对Unicode
的可变长度字符编码,又称万国码
UTF-8
用1到4个字节编码Unicode
字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)
特点
- 变长的编码方式,使用1-4个字节表示一个字符,即根据不同的符号而变化字节长度
- 用来表示
Unicode
标准中的任何字符,且其编码中的第一个字节仍与ASCII
兼容 ;ASCII
是UTF-8
的一个子集
Unicode是一种编码方式,而UTF是一种存储方式,UTF-8是Unicode的一种实现方式之一
GBK
由于ASCII编码不支持中文,需要寻求一种编码方式来支持中文。国人就定义了一套编码规则:
- 当字符小于127位时,与ASCII的字符相同
- 但当两个大于127的字符连接在一起时,就代表一个汉字
- 第一个字节称为高字节(从0xA1-0xF7)
- 第二个字节为低字节(从0xA1-0xFE)
这样大约可以组合7000多个简体汉字。这个规则叫做GB2312
由于汉字众多,有些字无法表示,重新定义规则: 在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开始 。这种扩展方案称之为
GBK
但是,中国有56个民族,再次对编码规则进行了扩展,又加了近几千个少数民族的字符,再次扩展后得编码叫做GB18030