1.基础概念

1.1 位/字节

1.1.1 位(bit)

也叫二进制位,值可为 0/1

1.1.2 字节(byte)

  • 8个二进制位表示一个字节(00000000--11111111
  • 可以表示 0-255 之间的任意数字
  • 可以用字节表示任何内容(数字,字符,图像等),这取决于如何解析字节
  • 字节的最高位位于最左边,最低位在最右边

1.2 码表/编码/解码

1.2.1 码表

电脑编码系统,数值与字符的对应关系(一个字节可换算成数值)

1.2.2 编码

根据码表,将字符换成1-n个字节,进行存储

1.2.3 解码

按不同的编码规则,将 1-n个字节换自成字符

2.字符集

2.1 Ascii 【常用、不通用】

  • 计算机最开始支持的基于拉丁字母的编码
  • 使用一个字节(8位)来表示
  • 最高位始终为0,剩下的7位表示一个字符(范围为 0-127)
  • 0-31/127 表示控制字符(不可见),32-126表示可见字符
  • 缺点:
    • 适用于现代英文和其它西欧语言
    • 无法支持多种语言

2.2 Latin1/ISO-8859-1【常用、不通用】

  • 基于 ASCII 码构建,向下兼容ASCII
  • 最高位也参与字符表示(范围为 0-255)
  • 0-31/127/128-159 表示控制字符(不可见),32-126/160-255 表示可见字符
  • 缺点
    • 仅扩展支持部分于欧洲使用的语言
    • 不支持中文和东亚等国家语言

2.3 Unicode 【常用、通用】

  • 表达任意语言的任意字符而设计
  • 一个字符代表一个code,不存在二义性
  • 只规定了某个字符应该对应哪一个code,未规定编码规则

2.3.1 UTF-8 编码规则 【重点学习】

  • 【变长】的 unicode 编码规则
  • 1-4 个变长的字节表示,
  • 完全兼容 ASCII 编码

  • 对于单字节

    • 字节的第一位为0,后面7位为这个符号的 Unicode 码( 兼容 ASCII
  • 对于多字节

    • 第一个字节的前 n1,表示包含n个字节,第 n+1位设为 0
    • 后面的 n-1个字节的前2位为 10
    • 其它未提及的位,全部为这个符号的 Unicode 码。
  • 编码规则总结:

      Unicode符号范围       |        UTF-8编码方式
          (十六进制)        |         (二进制)
      ------------------------------------------------------------------
       0000 0000-0000 007F | 0xxxxxxx
       0000 0080-0000 07FF | 110xxxxx 10xxxxxx
       0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
       0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    
  • 即:如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

2.3.1 UTF-16 编码规则

  • 采集 2/4 个字节表示
  • 0-65535 常用的码点:使用2个字节表示
  • 65536+ 不常用的码点:使用4个字节表示

2.3.1 UTF-32 编码规则

  • 固定使用 4 个字节表示(英文字母也使用4个字节表示,浪费空间)

学习列表:
  1. https://dailc.github.io/2017/05/17/severalCommonlyCharEncoding.html
  2. http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  3. https://www.cnblogs.com/golove/p/3222096.html