# 字符编码

> CIE A-Level 计算机科学 · 9618 (2022-2024)
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u1-character-encoding/

本模块讲解文本字符如何在计算机系统中以二进制数据存储。你将学习常见编码方案（ASCII、扩展ASCII、Unicode）以及如何计算文本字符串的存储需求。

**先修:** [二进制与十六进制数表示](https://www.owlsprep.com/zh/study/cie-9618-u1-binary-hexadecimal/)

## 学习目标

- 解释文本字符如何被编码为二进制数据
- 比较ASCII、扩展ASCII和Unicode编码方案
- 计算存储给定文本字符串所需的内存大小
- 识别字符编码计算中的常见错误

## 字符编码原理

计算机上显示的所有文本都以二进制数据存储。字符集是系统可编码的字符集合，包括字母、数字、符号和控制字符。字符集中的每个字符都被分配一个唯一的二进制数。

**字符编码** — 将字符集中每个字符映射到唯一二进制值的过程，使字符可以以数字形式存储或传输。

*例:* 字符'A'在ASCII中被映射为$01000001$。

**例题:** 一个字符集每个字符使用7位，该字符集最多可以编码多少个唯一字符？

1. 每个比特可以有2种可能的值（0或1）。对于$n$位比特，唯一组合的数量是$2^n$。
2. 代入$n = 7$：
3. $$2^7 = 128$$
4. 一个7位字符集可以编码128个唯一字符。

**考试命令词**

- **Calculate** — 展示所有计算步骤，得出数值答案 *(如果你只写最终答案不展示步骤，会被扣分)*

> **考试提示:** 永远记住：当每个字符占$n$位时，唯一字符的数量是$2^n$，而不是$2n$。

## ASCII与扩展ASCII

ASCII（美国信息交换标准代码）是应用最广泛的早期字符编码，最初是为早期计算机网络中的英语通信设计的。

**7位ASCII** — 一种7位编码方案，支持128个字符，包括大小写英文字母、数字、标点符号和控制字符（例如换行、退格）。

7位刚好可以放入一个8位字节中，原本多余的1位用于奇偶校验纠错。后来这一位被重新利用，产生了扩展ASCII。

**扩展ASCII** — 一种8位编码，将7位ASCII扩展为$2^8 = 256$个唯一字符，增加了额外符号和西欧语言的带重音字符。

**例题:** 使用扩展ASCII存储字符串"HELLO CIE"，最少需要多少字节？

1. 扩展ASCII每个字符占1字节（8位）。计数所有字符，包括空格。
2. 计数字符：H、E、L、L、O、（空格）、C、I、E，共9个字符。
3. $$9 \times 1 = 9 \text{ bytes}$$
4. 该字符串需要9字节的存储空间。

## Unicode

ASCII和扩展ASCII仅支持少量字符，不足以满足非英语语言、表情符号和特殊学术/技术符号的需求。Unicode就是为解决这个问题而开发的。

**Unicode** — 一种通用字符编码标准，旨在支持所有书面语言、符号和表情符号，迄今为止已定义了超过149,000个字符。

Unicode有多种编码格式（称为Unicode转换格式，即UTF），每个字符的比特长度各不相同：

- **UTF-8**：可变长度编码，每个字符占1-4字节。向后兼容7位ASCII，是万维网最常用的编码。
- **UTF-16**：每个字符占2或4字节，多用于许多操作系统的内部文本存储。
- **UTF-32**：每个字符固定占4字节，实现简单但对大多数日常使用来说效率低下。

**例题:** 比较字符串"Apple 🍎"在UTF-8和扩展ASCII中的存储情况，解释为什么扩展ASCII无法显示该表情符号。

1. 计数总字符数：A、p、p、l、e、（空格）、🍎，共7个字符。
2. 扩展ASCII只有256个字符编码，不存在该表情符号的编码。它只能存储前6个字符（"Apple "），并会显示替换错误字符。总大小 = 6 × 1字节 = 6字节。
3. 在UTF-8中，所有ASCII字符（包括空格）每个都占1字节，表情符号占4字节。
4. $$(6 \times 1) + (1 \times 4) = 10 \text{ total bytes}$$
5. UTF-8可以用10字节正确编码全部7个字符，而扩展ASCII无法编码该表情符号。

## 计算文本存储需求

考试中常见的3-5分题目会要求你计算存储给定文本块所需的总内存大小。无论使用哪种编码，方法都遵循一套简单一致的流程。

> **tip**
>
> 一定要把空格和标点也算作字符！它们和字母一样需要编码，因此会增加总存储大小。

**例题:** 一本100页的书使用16位定长Unicode编码。如果每页平均有300个单词，每个单词有5个字符加1个空格，计算总大小（单位：千字节，1 KB = 1000字节）。

1. 计算每页平均字符数：每个单词5字符 + 1空格 = 每个单词6字符，每页300单词 = 300 × 6 = 每页1800字符。
2. 16位定长编码意味着16位 = 每个字符占2字节。
3. 100页总字符数：100 × 1800 = 180,000字符。
4. $$\text{Total size} = 180000 \times 2 = 360000 \text{ bytes} = 360 \text{ KB}$$

**概念自测**

检验你的理解：

1. 如果每个字符占10位，一共可以编码多少个唯一字符？

   - 1024
   - 512
   - 10
   - 20

   *解析:* 正确：$2^{10} = 1024$个唯一组合。

## 常见错误

- **错误做法:** 计算总存储时忘记统计空格和标点符号
  - 原因: 大多数学生只统计可见字母，但所有字符都需要编码
  - 正确做法: 永远要统计字符串中的每个字符，包括空白符和标点符号
- **错误做法:** 将唯一字符数量算成$2n$而不是$2^n$
  - 原因: 混淆了比特数和可能的二进制组合数量
  - 正确做法: 记住$n$位比特可以得到$2^n$个唯一组合，因此一定要使用幂运算
- **错误做法:** 假设所有Unicode都是每个字符定长2字节
  - 原因: 只有16位定长Unicode每个字符占2字节；最常用的Unicode格式都是可变长度的
  - 正确做法: 始终使用题目中指定的比特长度，不要默认假设一个值
- **错误做法:** 认为扩展ASCII一定和Unicode兼容
  - 原因: 只有7位ASCII向后兼容UTF-8；扩展ASCII使用的额外编码是非标准的，和Unicode不匹配
  - 正确做法: 记住扩展ASCII的字符值在Unicode中可能映射错误

## 速查表

| 编码方案 | 每个字符比特数 | 最大唯一字符数 | 常见应用场景 |
| --- | --- | --- | --- |
| 7位ASCII | 7位 | 128 | 基础英文文本 |
| 扩展ASCII | 8位 | 256 | 西欧语言 |
| 定长16位Unicode | 16位 | 65536 | 通用纯文本 |
| UTF-8 | 1-4字节（可变） | >149,000 | 网页，向后兼容7位ASCII |

## 下一步

字符编码是信息表示中的核心主题，经常以简短计算题的形式出现在CIE 9618的试卷1中。掌握字符计数和存储大小计算的方法是考试中轻松拿分的途径。这个概念是所有文本数据处理、压缩和网络数据传输的基础。接下来，你将继续学习其他常见媒体类型（图像、音频）如何在计算机系统中表示为二进制数据。

- [数据压缩](https://www.owlsprep.com/zh/study/cie-9618-u1-data-compression/)
- [图像的二进制表示](https://www.owlsprep.com/zh/study/cie-9618-u1-binary-representation-of-images/)
- [声音的二进制表示](https://www.owlsprep.com/zh/study/cie-9618-u1-binary-representation-of-sound/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u1-character-encoding/
