2020-08-09

编码哪里逃

通过今天的学习让你再次理解各种编码

首先让我们聊聊何为字符、何为字符集、何为字符编码方式

  • 字符(character)
    字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号。
  • 字符集(character set)
    字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
  • 字符编码方式(character encoding)
    字符编码也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。

接下来让我们看看这些常用的字符编码

  • Unicode

    Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字.

    Unicode是一个码表,其中记录着字符与数字对应,目前收录14万+个字符!

    特点:

    • 是一个单一的,通用的字符编码标准
    • 是统一的,固定宽度的编码方案
    • 是与语言无关的代码页
    • 是所有ANSI字符集的一个超集
    • 字符集包括新字符集
    • 字符包含跨语言重复的编码
    • 编码的空间范围从U + 0000 U +10ffff。
  • UTF-8

    UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

    优点:utf-8很完美的解决了空间问题

  • UTF-16

    “变长+定长”:常见的字符2字节,不常见字符4字节
    如果字符在Unicode码表中的值小于等于两字节,编码结果就是固定的两个字节的码表值
    对于不常用的特殊字符,例如emoji,超出两个字节
    utf-16也有内部的算法,编码结果为4字节

    优点:utf-16是一种折中方案,既能保证数据对齐,又不太浪费空间

  • UTF-32

    定长的4字节编码,完全参照Unicode码表中的值,位数不够,就补0,以保证能把 UCS 完全表达出来
    实际上 UCS 的字符数量根本不需要用 32 位表示,UTF-32 极大地浪费了空间。另外,由于组合字符的存在,定长表示并不能如预期那样迅速地定位字符

    优点:非常直接,与Unicode码表中的值相同。

  • ASCII

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。国际上普遍采用ASCII编码作为通用的字符编码。

    因为1位二进制数可以表示(21=)2种状态:0、1;而2位二进制数可以表示(22)=4种状态:00、01、10、11;依次类推,7位二进制 数可以表示(27=)128种状态,每种状态都唯一地编为一个7位的二进制码,对应一个字符(或控制码),这些码可以排列成一个十进制序号0~127。所 以,7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。

    2020-08-09

  • GB2312/GBK

    GB2312是最早一版的中文编码,每个字占据2bytes。由于要和ASCII兼容,那这2bytes最高位不可以为0了(否则和ASCII会有冲突)。在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字。

    GB2312 是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符集”,由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB 是“国标” 二字的汉语拼音缩写。

    GBK 是又一个汉字编码标准,全称《汉字内码扩展规范》(GBK),英文名称 Chinese Internal Code Specification

    GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后者过渡过程中的一个承上启下的标准。

    GBK 采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。