字符集
计算机系统里的字符集,就是已编号的字符的有序集合。比如ASCII字符集,按照编号顺序排列。
字符集编码过程
一个字符集
从诞生到真正让计算机使用大致要经历下边5个步骤:
-
明确包含字符的范围。
这个步骤就是确定
字符集
里应该包含哪些字符。比如ASCII字符集
收录128个字符,而GB2312字符集
收录7445个字符。 -
给步骤
1
中确定的字符进行编号。对于字符集中已经确定的字符,想个办法让某个字符和某个数字建立一一对应关系。
比如
ASCII字符集
,字符只有128个,所以直接给每一个字符指定一个0~127
的数字。但是比较复杂的字符集就不是那么简单了,比如GB2312字符集
用了区位码
的方式来给字符编号。特别注意:编号与下边步骤中的
编码
是两个完全不同的概念。 -
将步骤
2
中的编号
确定逻辑上的字符编码
。计算机只能认识二进制,要把字符存到计算机里需要把字符
编号
映射为二进制数据。这种映射有的是直接把编号映射为二进制数据,有的因为一些原因不能直接映射,采用一些算法来计算出该编号对应的二进制数据。Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释 0011 0000 060 48 0x30 0 字符0 0011 0001 061 49 0x31 1 字符1 0011 0010 062 50 0x32 2 字符2 0011 0011 063 51 0x33 3 字符3 0011 0100 064 52 0x34 4 字符4 0011 0101 065 53 0x35 5 字符5 0011 0110 066 54 0x36 6 字符6 0011 0111 067 55 0x37 7 字符7 0011 1000 070 56 0x38 8 字符8 0011 1001 071 57 0x39 9 字符9 但是用二进制表示
字符
需要注意一下这些事:-
对于一段文本的二进制文件,计算机一次应该读多少位呢?
-
计算机里是以
字节
(8位)为基本处理单位的,不同的字符集编码有不同的规定,有的一次读一个字节,有的一次读2个,有的一次读4个。所以一次读的位数应该是8的倍数。 -
计算机一次读的规定的字节称为
编码单位
(英文名叫Code Unit
),也叫码元
。
逻辑字符编码
的意思就是把步骤2
中的字符编号映射为一个二进制数字,并且规定好码元
大小。一个字符
也可以由几个码元
排列起来,这个排起来的序列可以称之为码元序列
,例如utf-8有可能一个字符由几个码元
排列起来的。对于同一种字符集,因为从
编号
映射到二进制数据的方式不同或者采用的码元
大小不一样,同一种字符集也可能有多种编码方式。(unicode字符集) -
-
给步骤
3
中确定的逻辑上的字符编码生成物理上的字符编码。对于步骤
3
确定的二进制数字,是跟特定的计算机系统平台无关的逻辑意义上的编码
,那么所谓的物理上的字符编码
就是跟特定的计算机系统平台有关的更具体的编码。这个主要是针对
码元
是多个字节的情况,码元
为单个字节的可以认为步骤3和步骤4是一样的。字节的排列顺序会受到不同系统的影响。经过物理编码后的二进制序列,我们称之为
字节序列
。当然,很多时候码元序列
和字节序列
的值是一样的。 -
面向计算机更底层,进行进一步的适应性编码处理。
解码就是编码的逆过程
ASCII编码规定1个字节作为1个码元
01001100 01001101 01001110
1001100 对应编号 76 (L)
1001101 对应编号 77 (M)
1001110 对应编号 78 (N)
字符集和字符编码模型介绍
字符集 | 说明 |
---|---|
ASCII | 美国信息交换标准代码, 包含字母、数字和一些特殊符号 |
GB2312 | 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。 |
BIG5 | 又称大五码或五大码,宏碁(Acer)、神通(MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。是台湾发明的,繁体字符集。 |
GBK | GBK 字符集就是在GB2312 的基础上,对它收录的字符做了一个扩充,共收录 21886 个汉字和图形符号,BIG5的字符集,非国家标准,K代表扩展。 |
GB18030 | GB家族的新版字符集。 |
unicode | 包含ASCII字符集,重新定义了全球通用的字符集。 |
编码模型 | 说明 |
---|---|
ASCII | ASCII字符编码,以0-127编号,使用编号直接进行二进制编码 |
GB2312 | 最早的简体中文编码,使用分区编码 |
BIG5 | 繁体中文编码,主要用于台湾地区 |
GBK | 略 |
GB18030 | GB家族的新版编码,向下兼容 |
UTF-8、UTF-16、UTF-32 | 国际化编码标准,码元 大小分别为1个字节、2个字节、4个字节。 |
unicode字符集
编码的时候目前码元
大小有1个字节、2个字节、4个字节这么三种情况,分别对应的编码方式是UTF-8
、UTF-16
、UTF-32
这三种
UTF-8
这种编码方案的码元
采用一个字节。但是一个字节最多只能表示256个字符。所以UTF-8编码
是可以使用了多个字节组成一个字符,用首字节的开头几位来辨别是一个字符用几个字节编码的:
- 如果首字节以0开头,肯定是单字节编码(单个码元);
- 如果首字节以110开头,肯定是双字节编码(2个码元);
- 如果首字节以1110开头,肯定是三字节编码(3个码元)。
UTF-16
这种编码方案的码元
采用2个字节,但是2个字节最多只能表示65536个字符,UTF-16
提出了一个代理区
的概念。
UTF-32
这种编码方案的码元
采用4个字节,4个字节就可以表示4294967296
个数,所以使用一个码元(4字节)就基本可以表示unicode字符集所有的编号了。
Tip:
u字符的在三种编号被编号为:
UTF-8
01110101
UTF-16
00000000 01110101
UTF-32
00000000 00000000 00000000 01110101
所以UTF-16、UTF-32在编码0~127编号的字符的时候会比UTF-8浪费。
BOM(Byte Order Mark)字节顺序标记
当使用windows记事本保存文件的时候,编码方式可以选择ANSI(通过locale判断,简体中文系统下是GB家族)、UTF-16LE、Utf-8等。
windows(例如:简体中文系统)在文件头部增加了几个字节以表示编码方式,三个字节(0xef, 0xbb, 0xbf)表示UTF-8;两个字节(0xff, 0xfe或者0xfe, 0xff)表示UTF-16(Unicode);无表示GB**。
excel沿用了windows判断编码的逻辑(上文提到),当发现无BOM时,采用GB18030编码进行解码而导致内容乱码。