字符集编码

字符集

计算机系统里的字符集,就是已编号的字符的有序集合。比如ASCII字符集,按照编号顺序排列。

字符集编码过程

一个字符集从诞生到真正让计算机使用大致要经历下边5个步骤:

  1. 明确包含字符的范围。

    这个步骤就是确定字符集里应该包含哪些字符。比如ASCII字符集收录128个字符,而GB2312字符集收录7445个字符。

  2. 给步骤1中确定的字符进行编号。

    对于字符集中已经确定的字符,想个办法让某个字符和某个数字建立一一对应关系。

    比如ASCII字符集,字符只有128个,所以直接给每一个字符指定一个0~127的数字。但是比较复杂的字符集就不是那么简单了,比如GB2312字符集用了区位码的方式来给字符编号。

    特别注意:编号与下边步骤中的编码是两个完全不同的概念。

  3. 将步骤2中的编号确定逻辑上的字符编码

    计算机只能认识二进制,要把字符存到计算机里需要把字符编号映射为二进制数据。这种映射有的是直接把编号映射为二进制数据,有的因为一些原因不能直接映射,采用一些算法来计算出该编号对应的二进制数据。

    Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释
    0011 0000060480x300字符0
    0011 0001061490x311字符1
    0011 0010062500x322字符2
    0011 0011063510x333字符3
    0011 0100064520x344字符4
    0011 0101065530x355字符5
    0011 0110066540x366字符6
    0011 0111067550x377字符7
    0011 1000070560x388字符8
    0011 1001071570x399字符9

    但是用二进制表示字符需要注意一下这些事:

    • 对于一段文本的二进制文件,计算机一次应该读多少位呢?

    • 计算机里是以字节(8位)为基本处理单位的,不同的字符集编码有不同的规定,有的一次读一个字节,有的一次读2个,有的一次读4个。所以一次读的位数应该是8的倍数。

    • 计算机一次读的规定的字节称为编码单位(英文名叫Code Unit),也叫码元

    逻辑字符编码的意思就是把步骤2中的字符编号映射为一个二进制数字,并且规定好码元大小。一个字符也可以由几个码元排列起来,这个排起来的序列可以称之为码元序列,例如utf-8有可能一个字符由几个码元排列起来的。

    对于同一种字符集,因为从编号映射到二进制数据的方式不同或者采用的码元大小不一样,同一种字符集也可能有多种编码方式。(unicode字符集)

  4. 给步骤3中确定的逻辑上的字符编码生成物理上的字符编码。

    对于步骤3确定的二进制数字,是跟特定的计算机系统平台无关的逻辑意义上的编码,那么所谓的物理上的字符编码就是跟特定的计算机系统平台有关的更具体的编码。

    这个主要是针对码元是多个字节的情况,码元为单个字节的可以认为步骤3和步骤4是一样的。字节的排列顺序会受到不同系统的影响。

    经过物理编码后的二进制序列,我们称之为字节序列。当然,很多时候码元序列字节序列的值是一样的。

  5. 面向计算机更底层,进行进一步的适应性编码处理。

解码就是编码的逆过程

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)创立,故称大五码。是台湾发明的,繁体字符集。
GBKGBK字符集就是在GB2312的基础上,对它收录的字符做了一个扩充,共收录 21886 个汉字和图形符号,BIG5的字符集,非国家标准,K代表扩展。
GB18030GB家族的新版字符集。
unicode包含ASCII字符集,重新定义了全球通用的字符集。
编码模型说明
ASCIIASCII字符编码,以0-127编号,使用编号直接进行二进制编码
GB2312最早的简体中文编码,使用分区编码
BIG5繁体中文编码,主要用于台湾地区
GBK
GB18030GB家族的新版编码,向下兼容
UTF-8、UTF-16、UTF-32国际化编码标准,码元大小分别为1个字节、2个字节、4个字节。

unicode字符集编码的时候目前码元大小有1个字节、2个字节、4个字节这么三种情况,分别对应的编码方式是UTF-8UTF-16UTF-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编码进行解码而导致内容乱码。

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值