计算机基础

电脑为啥需要 ASCII、Unicode、UTF-8 这些编码?

前言🔖


很多新手学电脑、写代码,第一眼看到 ASCII、Unicode、UTF-8 直接懵圈。

名字长得像专业黑话,网上教程全是生硬定义:什么「字符集」「编码规则」「字节存储」,越看越糊涂。

今天我抛开所有专业术语,用人话+生活化比喻,一次性讲透这三个东西到底是什么、为什么存在、有什么区别,看完永久不混淆。

  

先搞懂底层逻辑:电脑只认识 0 和 1🔖


记住一句核心真理:

电脑没有眼睛,看不懂文字、字母、汉字,它只认识两个数字:0 和 1。

那问题来了:我们在电脑上打 A、打 1、打汉字 你好,电脑怎么知道是什么意思?

答案很简单:必须给每一个文字,分配一个专属的二进制编号。就像每个人的身份证号,一人一号,绝不重复。而 编码,就是这套「给文字编身份证号的规则」。

ASCII、Unicode、UTF-8,全部都是不同时代、不同版本的编码规则

  

举实例:你写「你好」两个汉字,电脑到底发生了什么?🔖


🔹1. 你键盘敲:你好

你看到的是屏幕上两个漂亮汉字:

你 好

  

🔹2. 但电脑根本不认识汉字

电脑大脑只认:0 和 1

它不认识 “你” 是什么意思,也不认识长什么样。

  

🔹3. 所以必须靠「编码」做翻译

系统规则(比如 UTF-8)提前约定好了:

  • 汉字 固定对应一串编号
  • 汉字 固定对应另一串编号

然后再把编号转成 01 二进制 存起来。

汉字:你
UTF-8 编码编号:E4 BD A0
转成二进制 01:
你 → 11100100 10111101 10101010
好 → 11100101 10100101 10111101

  

🔹4. 结论:

✅ 你在电脑里写的任何汉字、字母、符号

✅ 硬盘、内存、网络里存的全部都是 0 和 1

根本没有汉字本身,只有编码对应的 01 串。

  

🔹5.打个超好懂的比喻

把 编码 当成一本对照表:

你写字:你好
→ 电脑查字典(UTF-8)
→ 翻译成01 数字存硬盘

下次打开文件:
→ 电脑再拿这本字典反向翻译
→ 把 01 变回汉字显示在屏幕上

如果编码不对(比如一个用 GBK,一个用 UTF-8)
查表对不上 → 就变成乱码。

  

文本是如何在另一个的电脑上屏幕显示出正确的内容呢? 🔖


两台电脑,怎么把「你好」发过去、对方屏幕还能正确显示?

先记住两个核心

  1. 电脑只存、只传 0 和 1,不存汉字。
  2. 两边电脑必须用同一套编码规则(比如都是 UTF-8)。
全过程:从你打字 → 发给另一台电脑 → 对方屏幕显示「你好」

第一步:你在电脑输入「你好」
  你的电脑系统查 UTF-8 编码表:
  “你” → 分配固定编码编号
  “好” → 分配固定编码编号
  再把编号转成二进制 01 串
  电脑硬盘、内存里,只存这一串 01,没有汉字。

第二步:把这串 01 发给另一台电脑
  网络传输的时候,
  根本没有发 “你好” 这两个汉字,
  只发了一串 01010011… 二进制数据流。
  就像我给你发一串暗号数字,不发文字。

第三步:另一台电脑收到一堆 0 和 1
  对方电脑拿到的,也是纯 01,它也看不懂汉字。

第四步:关键一步 —— 对方也有一模一样的编码字典
  对方电脑系统也用 UTF-8:
  拿着收到的这串 01
  去翻自己本地的编码对照表:
  读到这串 01 → 匹配到汉字「你」
  读到下一串 01 → 匹配到汉字「好」

第五步:渲染到屏幕
  系统把匹配出来的「你、好」
  调用字体文件,画出汉字笔画,
  于是你在对方屏幕上看到了正常文字。

那为什么会出现「乱码」?

如果:

  • 你电脑用 UTF-8 编码
  • 对方电脑用 GBK 编码

两边字典不一样:你发的同一串 01,对方拿另一本字典去查,对应出来的不是原来的字,就变成问号、方框、奇怪乱码。

极简一句话总结:

  1. 文本在电脑里、网络里永远只是 0 和 1
  2. 发送方:汉字 → 按编码译成 01 发出;
  3. 接收方:收到 01 → 用同一份编码字典译回汉字;
  4. 编码一致 = 显示正确,编码不一致 = 乱码。

  

文字显示全链路简易流程图

文字显示全链路简易流程图

开始
  ↓
【键盘打字输入】
  ↓
【字符编码】
(转成Unicode/UTF-8二进制码)
  ↓
【数据传输】
(系统/网络传递编码数据)
  ↓
【接收解码】
(把二进制还原成字符编号)
  ↓
【匹配字体库】
(按编号调取对应字形轮廓)
  ↓
【屏幕渲染绘制】
(像素点阵/矢量绘图显示文字)
  ↓
结束

  

为啥电脑查到编码后,屏幕就能画出「你好」?🔖


先前置一个关键常识:电脑屏幕本身只认识「小格子亮 / 不亮」,它根本不认识汉字、字母。屏幕就是密密麻麻的像素小光点,汉字不是印在屏幕上的,是一个个像素点亮出来的

🔹第一步:编码先找到「字的身份证」

对方电脑收到 01 二进制 → 用 UTF-8 解码:识别出:这是汉字 、汉字

现在电脑只知道:我要显示「你」这个字,但还不知道「你」长什么样、笔画怎么画。

  

🔹第二步:调用字体文件(核心关键)

你的电脑里都装了字体:微软雅黑、宋体、黑体、苹方 这些。

每一个字体文件,本质就是一本字形画册

  • 里面存着每一个汉字的像素轮廓、笔画形状
  • 比如「你」字:横竖撇捺在哪、占多少格子、笔画粗细,全都提前画好存在字体文件里

打个比方:编码告诉你 编号是:你

字体文件告诉你 编号「你」长这个样子:撇、竖、撇、横钩、竖钩、撇……

  

🔹第三步:把汉字笔画,翻译成「像素点亮」

屏幕是由几十万、上百万个像素小方格组成的。

系统拿着字体里「你」的字形模板:

  1. 告诉显卡:哪些像素点 点亮
  2. 哪些像素点 熄灭
  3. 还要填颜色(黑色 / 白色 / 彩色)
举个极简例子(放大看汉字):

把「你」字放进一个方格矩阵里,

有笔画的位置 → 像素点亮

没笔画的位置 → 像素灭

密密麻麻的像素拼在一起,你肉眼看到的就是工整的汉字。

  

🔹补充两个你肯定好奇的点

1. 为啥换字体,字就变样子?

因为换了另一本字体画册

  • 宋体的「你」笔画有棱角
  • 黑体的「你」笔画粗细均匀系统还是同一个编码「你」,只是换了一本字形画册,画出来的样子就变了。

2. 如果对方电脑没有这个字体会怎样?

比如你用「方正楷体」发文字,对方电脑没装这个字体:系统会自动用默认字体(比如微软雅黑) 替代画出来,字还能看懂,只是样式变了,不会乱码。

3. 乱码方框 □ 是怎么来的?

解码成功了,但是字体文件里根本没有这个汉字的字形,找不到笔画模板,没法画,只能画一个空方框占位。

  

🔹整条链路极简复盘

  1. 传过来的是 01 二进制
  2. 解码 → 认出是汉字「你、好」(只知道编号)
  3. 字体文件 → 拿到这个字的笔画形状
  4. 控制屏幕像素点亮 / 熄灭 → 拼出汉字
  5. 你的眼睛就看到了正常的「你好」

  

Windows 记事本显示文字的流程?🔖


🔹记事本完整工作流程

  1. 你在记事本敲「你好」
  2. 记事本把汉字存成 UTF-8 编码(现在默认都是 UTF-8)
  3. 打开文件时:
    • 读取二进制数据
    • 按 UTF-8 解码成 Unicode 字符编号
    • 调用系统默认字体(微软雅黑 / 宋体)
    • 匹配字体里的笔画轮廓
    • 缩放、上色、渲染,画在记事本窗口里
  4. 保存、另存为里的「ANSI/UTF-8/Unicode」,就是改解码和编码规则,选错就乱码。

  

🔹补充:记事本乱码本质

保存用 GBK 编码 → 打开按 UTF-8 解码

编号对不上 → 找不到正确字体轮廓 → 显示成奇怪字符 / 方框。

  

🔹小结

  1. 编码:管文字编号,不管长什么样
  2. 字体文件:管字的长相笔画
  3. 渲染:拿编号找字体、按大小颜色画到屏幕像素上
  4. Windows 记事本、微信、浏览器、所有软件,全都是这套逻辑

  

第一代编码:ASCII(英文专属简易户口本)🔖


1、诞生背景

最早的电脑是美国人发明的,人家只用英文。

英文字母就26个大小写、再加数字、标点符号,总共没多少字符。

2、通俗理解ASCII

你可以把 ASCII 理解为:英文极简户口本

举个例子:

  • 字符 A → 编号65
  • 字符 a → 编号97
  • 字符 0 → 编号48

电脑看到一串0和1,转换成编号65,就知道:哦,这是大写A。

3、ASCII致命缺点

它只有 128个字符,只够装:英文、数字、简单标点。

汉字、日文、韩文、特殊符号?完全没有位置。

早期电脑拿到汉字,直接看不懂,这就有了大麻烦。

  

乱码的由来:各国自己造编码🔖


ASCII不够用,各个国家开始自己动手改编码:

  • 中国:搞出 GB2312、GBK,专门存汉字
  • 日本:搞出 Shift_JIS,存日文
  • 韩国:搞出EUC-KR,存韩文

这下新问题爆炸式出现:互相不兼容

举个最直白的例子:一台用GBK编码的中国电脑保存文件,发给日本电脑。日本电脑用日文编码翻译汉字,编号对不上,全部变成问号、乱码

总结:乱码的本质 = 编码规则不一样,翻译字典不匹配。

全世界迫切需要一本:全球通用、包含所有文字的超级字典。于是,Unicode 诞生了。

  

第二代编码:Unicode(全球通用超大字典)🔖


1、通俗理解Unicode

Unicode 理解为:全世界统一超级大字典

不管是中文、英文、日文、 emoji表情、冷门符号、古老文字,全部收录。给全世界每一个文字,分配独一无二的固定编号。

举例:

  • A 的Unicode编号:U+0041
  • 中 的Unicode编号:U+4E2D
  • 😀 的Unicode编号:U+1F600

2、Unicode的致命毛病

Unicode 只规定了:文字对应什么编号。但是!它没规定怎么存进电脑。而且为了兼容所有文字,Unicode预留空间极大,每个字符统一占用很大存储空间。

直白举例:英文字母A,明明只用很小空间就能存,Unicode也要给它分配大容量位置。

如果直接原生使用Unicode:占用内存大、传输慢、浪费硬盘流量

简单说:Unicode完美,但是太笨重,不好直接用。所以我们需要一个「优化压缩工具」,它就是 UTF-8。

  

第三代编码:UTF-8(Unicode的最优压缩格式)🔖


1、通俗理解UTF-8

UTF-8 就是Unicode的压缩优化版、实用落地版。

它不创造新编号,完全沿用Unicode的文字编号,只是改变存储方式

2、它聪明在哪里?(变长存储)

UTF-8 采用按需分配

  • 英文、数字:占用1个字节(极小,省钱省流量)
  • 中文:占用3个字节
  • 稀有表情、冷门文字:占用4个字节

需要多大空间,就用多大空间,不浪费一丝内存。

3、为什么现在全网都用UTF-8?

  • 兼容ASCII,老英文文件完全通用
  • 包含全球所有文字,不会乱码
  • 体积小、速度快、成本低

现在的网页、代码、文档、手机电脑,默认编码几乎全是UTF-8

一句话总结

  1. 电脑只懂 0 和 1,不认文字
  2. 编码就是:把文字翻译成 01 数字的统一规则
  3. ASCII:只能存英文;
  4. 各国自编编码:互相不兼容,到处乱码
  5. Unicode:全球统一文字编号,解决乱码根源;
  6. UTF-8:Unicode 最常用的存储传输方式。