前言🔖
很多新手学电脑、写代码,第一眼看到 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) 查表对不上 → 就变成乱码。
文本是如何在另一个的电脑上屏幕显示出正确的内容呢? 🔖
两台电脑,怎么把「你好」发过去、对方屏幕还能正确显示?
先记住两个核心
- 电脑只存、只传 0 和 1,不存汉字。
- 两边电脑必须用同一套编码规则(比如都是 UTF-8)。
全过程:从你打字 → 发给另一台电脑 → 对方屏幕显示「你好」 第一步:你在电脑输入「你好」 你的电脑系统查 UTF-8 编码表: “你” → 分配固定编码编号 “好” → 分配固定编码编号 再把编号转成二进制 01 串 电脑硬盘、内存里,只存这一串 01,没有汉字。 第二步:把这串 01 发给另一台电脑 网络传输的时候, 根本没有发 “你好” 这两个汉字, 只发了一串 01010011… 二进制数据流。 就像我给你发一串暗号数字,不发文字。 第三步:另一台电脑收到一堆 0 和 1 对方电脑拿到的,也是纯 01,它也看不懂汉字。 第四步:关键一步 —— 对方也有一模一样的编码字典 对方电脑系统也用 UTF-8: 拿着收到的这串 01 去翻自己本地的编码对照表: 读到这串 01 → 匹配到汉字「你」 读到下一串 01 → 匹配到汉字「好」 第五步:渲染到屏幕 系统把匹配出来的「你、好」 调用字体文件,画出汉字笔画, 于是你在对方屏幕上看到了正常文字。
那为什么会出现「乱码」?
如果:
- 你电脑用 UTF-8 编码
- 对方电脑用 GBK 编码
两边字典不一样:你发的同一串 01,对方拿另一本字典去查,对应出来的不是原来的字,就变成问号、方框、奇怪乱码。
极简一句话总结:
- 文本在电脑里、网络里永远只是 0 和 1;
- 发送方:汉字 → 按编码译成 01 发出;
- 接收方:收到 01 → 用同一份编码字典译回汉字;
- 编码一致 = 显示正确,编码不一致 = 乱码。
文字显示全链路简易流程图
文字显示全链路简易流程图 开始 ↓ 【键盘打字输入】 ↓ 【字符编码】 (转成Unicode/UTF-8二进制码) ↓ 【数据传输】 (系统/网络传递编码数据) ↓ 【接收解码】 (把二进制还原成字符编号) ↓ 【匹配字体库】 (按编号调取对应字形轮廓) ↓ 【屏幕渲染绘制】 (像素点阵/矢量绘图显示文字) ↓ 结束
为啥电脑查到编码后,屏幕就能画出「你好」?🔖
先前置一个关键常识:电脑屏幕本身只认识「小格子亮 / 不亮」,它根本不认识汉字、字母。屏幕就是密密麻麻的像素小光点,汉字不是印在屏幕上的,是一个个像素点亮出来的。
🔹第一步:编码先找到「字的身份证」
对方电脑收到 01 二进制 → 用 UTF-8 解码:识别出:这是汉字 你、汉字 好。
现在电脑只知道:我要显示「你」这个字,但还不知道「你」长什么样、笔画怎么画。
🔹第二步:调用字体文件(核心关键)
你的电脑里都装了字体:微软雅黑、宋体、黑体、苹方 这些。
每一个字体文件,本质就是一本字形画册:
- 里面存着每一个汉字的像素轮廓、笔画形状
- 比如「你」字:横竖撇捺在哪、占多少格子、笔画粗细,全都提前画好存在字体文件里
打个比方:编码告诉你 编号是:你
字体文件告诉你 编号「你」长这个样子:撇、竖、撇、横钩、竖钩、撇……
🔹第三步:把汉字笔画,翻译成「像素点亮」
屏幕是由几十万、上百万个像素小方格组成的。
系统拿着字体里「你」的字形模板:
- 告诉显卡:哪些像素点 点亮
- 哪些像素点 熄灭
- 还要填颜色(黑色 / 白色 / 彩色)
举个极简例子(放大看汉字): 把「你」字放进一个方格矩阵里, 有笔画的位置 → 像素点亮 没笔画的位置 → 像素灭 密密麻麻的像素拼在一起,你肉眼看到的就是工整的汉字。
🔹补充两个你肯定好奇的点
1. 为啥换字体,字就变样子?
因为换了另一本字体画册:
- 宋体的「你」笔画有棱角
- 黑体的「你」笔画粗细均匀系统还是同一个编码「你」,只是换了一本字形画册,画出来的样子就变了。
2. 如果对方电脑没有这个字体会怎样?
比如你用「方正楷体」发文字,对方电脑没装这个字体:系统会自动用默认字体(比如微软雅黑) 替代画出来,字还能看懂,只是样式变了,不会乱码。
3. 乱码方框 □ 是怎么来的?
解码成功了,但是字体文件里根本没有这个汉字的字形,找不到笔画模板,没法画,只能画一个空方框占位。
🔹整条链路极简复盘
- 传过来的是 01 二进制
- 解码 → 认出是汉字「你、好」(只知道编号)
- 查字体文件 → 拿到这个字的笔画形状
- 控制屏幕像素点亮 / 熄灭 → 拼出汉字
- 你的眼睛就看到了正常的「你好」
Windows 记事本显示文字的流程?🔖
🔹记事本完整工作流程
- 你在记事本敲「你好」
- 记事本把汉字存成 UTF-8 编码(现在默认都是 UTF-8)
- 打开文件时:
- 读取二进制数据
- 按 UTF-8 解码成 Unicode 字符编号
- 调用系统默认字体(微软雅黑 / 宋体)
- 匹配字体里的笔画轮廓
- 缩放、上色、渲染,画在记事本窗口里
- 保存、另存为里的「ANSI/UTF-8/Unicode」,就是改解码和编码规则,选错就乱码。
🔹补充:记事本乱码本质
保存用 GBK 编码 → 打开按 UTF-8 解码
编号对不上 → 找不到正确字体轮廓 → 显示成奇怪字符 / 方框。
🔹小结
- 编码:管文字编号,不管长什么样
- 字体文件:管字的长相笔画
- 渲染:拿编号找字体、按大小颜色画到屏幕像素上
- 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。
一句话总结
- 电脑只懂 0 和 1,不认文字;
- 编码就是:把文字翻译成 01 数字的统一规则;
- ASCII:只能存英文;
- 各国自编编码:互相不兼容,到处乱码;
- Unicode:全球统一文字编号,解决乱码根源;
- UTF-8:Unicode 最常用的存储传输方式。