首页 / 知识库 / 进大厂必备计算机基础 / 计算机组成原理

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 目录