编码

编码

今天在复习编译原理的时候,发现对底层的编码都是还停留在听过或者见过的状态,所以决定学习一下有关编码的知识。

编码概述

  • 定义:编码是将信息从一种形式或格式转换为另一种形式的过程,以便信息能够被存储、传输或处理。在计算机科学中,编码通常指将人类可读的信息(如文本、图像、声音等)转换为计算机可识别的二进制形式。
  • 目的:编码的主要目的是实现信息的有效存储、传输和处理。通过编码,信息可以在不同的系统、设备和网络之间进行交换和共享,同时还能对信息进行加密、压缩等操作以提高安全性、减少存储空间和传输带宽。

字符编码

ASCII编码

  • 背景与起源
    • 1960年代,计算机开始普及,但不同厂商使用不同的编码标准,导致信息交换困难
    • 1967年,美国标准化组织制定ASCII,实现了计算机间的标准化通信
  • 工作原理
    • 使用7位二进制数,可以表示128个字符(2^7 = 128)
    • 0-31:控制字符(如换行符= 10,回车符 13)
    • 32-127:可打印字符(如'A' = 65,'a' = 97,'0' = 48)
  • 优点
    • 简单易用,是最基础的编码标准
    • 至今仍被广泛使用,现代编码方案都兼容ASCII
  • 缺点
    • 只能表示英文字母和符号,无法表示其他语言字符
    • 例如:无法表示"中文"、"日本語"等字符

GB2312与GBK

  • GB2312
    • 起源:1980年,中国为解决计算机无法显示汉字问题而制定
    • 原理:采用双字节编码
      • 首字节范围0xA1-0xF7,次字节范围0xA1-0xFE
      • 加0xA1是为了避开ASCII码的0x00-0x7F区域,确保与ASCII兼容
      • 分区设计:
        • 01-09区:特殊符号
        • 16-55区:一级汉字(3755个常用字)
        • 56-87区:二级汉字(3008个次常用字)
        • 10-15区:保留区
      • 每个区94个字符,共94个区
    • 示例
      • "中"的GB2312编码为0xD6D0(第45区第60个汉字)
      • "国"的GB2312编码为0xB9FA(第16区第15个汉字)
  • 优点
    • 完全兼容ASCII
    • 包含6763个常用汉字,满足基本需求
    • 缺点
      • 汉字数量有限,部分生僻字无法表示
      • 不支持繁体中文、日韩文字
  • GBK
    • 起源:1995年推出,是GB2312的扩展
    • 特点
      • 向下完全兼容GB2312
      • 收录21003个汉字,包括繁体字
    • 示例
      • "㠭"(生僻字)在GB2312中无法表示,但GBK可以表示
    • 优点
      • 字符集更大,能满足绝大多数中文处理需求
      • 兼容性好,在中国大陆使用广泛
    • 缺点
      • 不是国际标准,在跨国际平台可能出现乱码
      • 无法表示其他国家的文字系统

Unicode与UTF编码

  • Unicode
    • 起源
      • 1991年推出,目标是统一全球所有字符编码
      • 由于各国编码标准不一,同一个二进制值在不同编码下可能表示不同字符,造成乱码
    • 特点
      • 为每个字符分配唯一编码点(Code Point)
      • 编码空间从U+0000到U+10FFFF,共17个平面(Plane)
      • 第0平面(BMP,基本多语言平面):U+0000至U+FFFF,收录最常用字符
      • 目前已收录超过14万个字符,包括各国文字、符号、emoji等
    • 重要概念
      • 码点(Code Point):字符在Unicode字符集中的唯一编号
      • 平面(Plane):Unicode编码空间的逻辑分区,每个平面收录65536个字符
      • 代理对(Surrogate Pair):使用两个16位值表示BMP之外的字符
    • 示例
      • "A" → U+0041(基本拉丁字母)
      • "中" → U+4E2D(CJK统一表意文字)
      • "😀" → U+1F600(补充表意平面,表情符号)
  • UTF-8
    • 原理:变长编码方案,使用1-4个字节表示一个字符
      • 对于单字节,最高位为0
      • 对于多字节,第一个字节以几个1开头,就使用几个字节编码
    • 编码规则
      1
      2
      3
      4
      5
      Unicode范围            UTF-8编码方式
      0000-007F: 0xxxxxxx
      0080-07FF: 110xxxxx 10xxxxxx
      0800-FFFF: 1110xxxx 10xxxxxx 10xxxxxx
      10000-10FFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    • 示例
      1
      2
      3
      4
      字符    Unicode编码点     UTF-8编码          二进制表示
      A U+0041 41 01000001
      中 U+4E2D E4 B8 AD 11100100 10111000 10101101
      😀 U+1F600 F0 9F 98 80 11110000 10011111 10011000 10000000
    • 优点
      • 完全兼容ASCII
      • 节省存储空间(常用字符占用字节少)
      • 自同步(可以从任意位置开始解码)
      • 无字节序问题
    • 缺点
      • 变长编码使字符定位较慢
      • 在内存中操作不如定长编码方便
  • UTF-16
    • 原理
      • BMP平面内字符:使用2个字节直接表示
      • BMP平面外字符:使用4个字节的代理对(Surrogate Pair)表示
    • 编码规则
      • BMP字符:直接用16位表示
      • 非BMP字符:将码点转换为代理对
        1. 码点减去0x10000得到20位数
        2. 高10位加上0xD800得到高位代理
        3. 低10位加上0xDC00得到低位代理
    • 示例
      1
      2
      3
      4
      字符    Unicode编码点     UTF-16编码        说明
      A U+0041 00 41 BMP内字符
      中 U+4E2D 4E 2D BMP内字符
      😀 U+1F600 D83D DE00 代理对表示
    • 优点
      • 处理中日韩文字效率高(大多在BMP平面内)
      • Java、JavaScript等语言内部采用此编码
      • 定长编码便于字符定位
    • 缺点
      • 不兼容ASCII
      • 存在大小端序问题(需要BOM标记)
      • 占用空间较大
      • 代理对处理复杂

数据编码

  • 数字编码
    • 二进制编码:将数字转换为二进制形式,是计算机处理数字信息的基础。例如,十进制数10的二进制编码是1010。
    • BCD编码:二进制编码的十进制数,将十进制数的每一位分别转换为4位二进制数。例如,十进制数10的BCD编码是0001 0000。
  • 图像编码
    • 位图编码:将图像的每个像素点的颜色信息直接存储起来,常见的位图格式有BMP、PNG等。
    • 压缩编码:通过减少图像数据的冗余信息来实现数据压缩,常见的压缩编码格式有JPEG、GIF等。JPEG采用离散余弦变换(DCT)和量化等技术,GIF采用LZW压缩算法。
  • 音频编码
    • PCM编码:脉冲编码调制,将模拟音频信号转换为数字信号,是音频数字化的基础。PCM编码的音频数据量较大。
    • 压缩编码:通过减少音频数据的冗余信息来实现数据压缩,常见的压缩编码格式有MP3、AAC等。MP3采用心理声学模型和变换编码等技术,AAC是MP3的改进版本,具有更高的压缩效率和音质。