09 - 文字和图片是怎么变成 0/1 的
数字能变成二进制我们懂了。那你屏幕上的这些汉字、你相册里的照片,又是怎么变成 0 和 1 存进计算机的?答案还是第 01 章那句话:约定一套编码规则。这一章讲清楚文字和图片的编码思路,顺便理解「乱码」是怎么来的。
文字:给每个字符编个号
思路很朴素:列一张大表,给每个字符分配一个唯一的数字编号,存的时候存这个编号(编号本身是二进制数),显示时再按表翻译回字符。
ASCII:最早的字符表
早期计算机只需要表示英文字母、数字、标点,一张 128 个编号的小表就够了,这就是 ASCII。比如:
- 大写
A的编号是 65 - 小写
a的编号是 97 - 数字字符
0的编号是 48
一个字符用一个字节存,够用又简单。
汉字怎么办?Unicode 登场
但世界上有汉字、日文、阿拉伯文、emoji……几万上十万个字符,128 个编号远远不够。于是有了 Unicode:一张囊括全世界所有字符的超级大表,给每个字符(包括每个汉字、每个 emoji)都分配唯一编号。比如汉字「中」的 Unicode 编号是 20013。
UTF-8:Unicode 的存储方式
Unicode 只是「编号表」,具体怎么把这些编号存成字节,最流行的方案是 UTF-8。它很聪明:
- 英文字符还是用 1 个字节(兼容老的 ASCII,省空间);
- 汉字等用 3 个字节;
- 更生僻的用 4 个字节。
常用的、需求量大的字符用得少字节,生僻的才用得多——这种「按需分配长度」的设计,让 UTF-8 既省空间又能表示全世界的字。今天的网页、代码文件绝大多数都用 UTF-8。
乱码是怎么来的
如果存的时候用一套编码规则,读的时候却用了另一套,翻译就对不上号,屏幕上就是一堆鬼画符——这就是乱码。所以打开文件出现乱码时,改一下「编码方式」往往就好了。
乱码的本质:编码和解码用的「字典」不是同一本。
图片:把画面切成一格格像素
图片的思路是把整幅图切成一个个小方格,每格叫一个像素(Pixel),然后记录每个像素的颜色。
而颜色又可以用数字表示:任何颜色都能由红(R)、绿(G)、蓝(B)三种基色按不同比例混合而成。每种基色用一个 0~255 的数字表示强度:
一个像素 = (R, G, B)
纯红 = (255, 0, 0)
纯白 = (255, 255, 255)
纯黑 = (0, 0, 0)
于是一张图片,就变成了「一大堆像素、每个像素三个数字」,而数字都能写成二进制。这就是图片变成 0/1 的原理。
- 一张图有多少像素,就是分辨率(比如 1920×1080)。
- 像素越多,图越清晰,占的空间也越大。
这解释了为什么原始图片那么大:1920×1080 的图有约 200 万个像素,每个像素 3 个数字,加起来好几 MB。
那 JPG、PNG 是什么
如果每张图都老老实实存每个像素,文件会大得离谱。所以有了图片压缩格式(JPG、PNG 等),用巧妙的算法把数据压小:
- 比如一大片纯蓝的天空,与其存几万个「蓝色像素」,不如记一句「这块区域都是蓝色」。
- JPG 追求小体积,会丢掉一点点人眼不易察觉的细节(有损压缩);PNG 保证不丢细节(无损压缩)。
声音、视频也是类似套路:先把连续的信号采样成一串数字,再用各种压缩格式(MP3、MP4)把体积压下来。
小结
- 一切信息变成 0/1 的通用套路就是:约定一套编码规则。
- 文字:给每个字符编唯一数字编号。ASCII(英文小表)→ Unicode(全世界字符大表)→ UTF-8(省空间的存储方式,按需用 1~4 字节)。编码与解码规则不一致就会乱码。
- 图片:切成一个个像素,每个像素用 RGB 三个数字表示颜色,数字再转二进制;像素越多越清晰、越占空间。
- 原始图/音/视频太大,于是有 JPG/PNG/MP3/MP4 等压缩格式(分有损和无损)。
下一章 → 10 - 按一次键盘,电脑内部发生了什么 | 回到 README 目录