编码
编码
今天在复习编译原理的时候,发现对底层的编码都是还停留在听过或者见过的状态,所以决定学习一下有关编码的知识。
编码概述
- 定义:编码是将信息从一种形式或格式转换为另一种形式的过程,以便信息能够被存储、传输或处理。在计算机科学中,编码通常指将人类可读的信息(如文本、图像、声音等)转换为计算机可识别的二进制形式。
- 目的:编码的主要目的是实现信息的有效存储、传输和处理。通过编码,信息可以在不同的系统、设备和网络之间进行交换和共享,同时还能对信息进行加密、压缩等操作以提高安全性、减少存储空间和传输带宽。
字符编码
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
5Unicode范围 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
- 节省存储空间(常用字符占用字节少)
- 自同步(可以从任意位置开始解码)
- 无字节序问题
- 缺点:
- 变长编码使字符定位较慢
- 在内存中操作不如定长编码方便
- 原理:变长编码方案,使用1-4个字节表示一个字符
- UTF-16
- 原理:
- BMP平面内字符:使用2个字节直接表示
- BMP平面外字符:使用4个字节的代理对(Surrogate Pair)表示
- 编码规则:
- BMP字符:直接用16位表示
- 非BMP字符:将码点转换为代理对
- 码点减去0x10000得到20位数
- 高10位加上0xD800得到高位代理
- 低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的改进版本,具有更高的压缩效率和音质。