计算机如何存储文字?从传纸条说起
为什么会有乱码?连工作多年的程序员都没完全搞懂的知识点
为什么 C/C++ 难学?
缺少必要的基础知识,学起来肯定会困难重重。
比如:计算机是怎么存储文字的?
这一点连许多工作多年的程序员都没有完全搞明白,时不时还会遇到文件乱码的问题。
不要期望在学校里老师会把这些知识传授给你。今天,让我们来解锁这个知识,打通任督二脉,让学编程变得更简单!
一个”老六”的传奇故事
课堂上的秘密通信
你上学时传过纸条吗?或者看过别人传纸条?
假设你写了这样一张纸条:
今天中午一起去吃饭吗?
传给同桌时,不幸被老师截获了… 😱 完蛋了!
💡 加密方案诞生
有个聪明的同学想出了一个办法:
约定用数字代替文字
建立一个对照表:
| 数字 | 字符 |
|---|---|
| 0001 | 今 |
| 0002 | 天 |
| 0003 | 中 |
| 0004 | 午 |
| … | … |
纸条内容变成:
0001 0002 0003 0004 ...
这样即使被老师截获,老师也看不懂你们在说什么!
规则:
- 每 4 位数字代表一个字符
- 0000 ~ 9999 可表示 10000 个字符,完全够用
🔥 方案被”抄袭”
这套方法被同班的一对情侣发现了:
“我靠,原来还可以这么操作!”
他们照着这个思路,也设计了自己的一套对照表。
❌ 乱码出现了!
问题来了:
如果他们的纸条丢到你这边,你用你的对照表翻译:
原意:我喜欢你
你翻译出来:天气真好
这就是 乱码 的由来!
计算机中的字符编码
ASCII 码的诞生
其实计算机早期是没有表示字符的方法的。
直到 20世纪60年代,为了满足在计算机中传输字符的需求,美国相关机构参考了”老六”的编码思路,制定了一套标准编码:
ASCII 码(American Standard Code for Information Interchange)
- 中文名:美国信息交换标准代码
📋 ASCII 编码规则
范围: 0 ~ 127,共 128 个字符
主要内容:
- 数字
0-9→ 编码48-57 - 大写字母
A-Z→ 编码65-90 - 小写字母
a-z→ 编码97-122 - 特殊字符:空格、标点符号、控制字符等
部分对照表:
| 字符 | ASCII码 | 二进制 |
|---|---|---|
| 0 | 48 | 00110000 |
| 9 | 57 | 00111001 |
| A | 65 | 01000001 |
| Z | 90 | 01011010 |
| a | 97 | 01100001 |
| z | 122 | 01111010 |
字符如何存储到硬盘?
🔑 关键:结合前面的知识
还记得我们前面学过的吗?
- 计算机使用二进制存储数据
- 硬盘就像一张巨大的纸,上面只能写 0 或 1
存储过程演示
以大写字母 A 为例:
步骤1: 查找 ASCII 码
A → 65
步骤2: 转换为二进制
65 (十进制) → 01000001 (二进制)
步骤3: 补齐到 8 位
ASCII 规定:必须用 8 个二进制位(1 Byte)表示一个字符
不足 8 位的前面补 0
步骤4: 写入硬盘
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │ ← 字符 'A'
└───┴───┴───┴───┴───┴───┴───┴───┘
🎬 A-Z 存储过程
从大写字母 A 到 Z,依次存储到硬盘:
01000001 ← A (65)
01000010 ← B (66)
01000011 ← C (67)
...
01011010 ← Z (90)
硬盘能存多少个英文字符?
💾 1TB 硬盘的容量
已知:
- 1 Byte = 1 个英文字符
- 1 TB = 1024 GB = 1024 × 1024 MB = 1024 × 1024 × 1024 KB = 1024 × 1024 × 1024 × 1024 Byte
计算:
1 TB = 1,099,511,627,776 Byte
≈ 1.1 万亿个英文字符
非常可怕的数量!📚
ASCII 的局限性
⚠️ 一个字节的瓶颈
问题: 1 Byte (8 bit) 最多只能表示 256 个字符
2^8 = 256
状态范围:0 ~ 255
这对于英文来说够了,但对于:
- 🇨🇳 中文:几万个汉字
- 🇯🇵 日文:几千个字符
- 🇰🇷 韩文:几千个字符
完全不够用!
双字节编码的诞生
💡 解决方案
使用 2 Byte(16 bit) 表示一个字符
容量:
2^16 = 65,536
状态范围:0 ~ 65,535
对于中文常用字(约 3000-4000 字)来说,远远够了!
📉 存储容量的代价
如果是 1TB 硬盘,存储中文字符的数量:
1,099,511,627,776 ÷ 2 = 549,755,813,888
≈ 5498 亿个中文字符
容量折半,但依然很多。
编码混乱导致的乱码
🌍 全球编码大战
全世界的语言和文字非常多,于是产生了非常多的文字编码:
- 中文:GB2312、GBK、Big5(繁体)等
- 日文:Shift_JIS、EUC-JP 等
- 韩文:EUC-KR、ISO-2022-KR 等
- 泰文:TIS-620 等
- …
💔 悲剧场景
场景1: 日本朋友发来消息
他的编码:Shift_JIS
你的编码:GBK
结果:乱码! �������
场景2: 泰国朋友说”萨瓦迪卡”
他的编码:TIS-620
你的编码:GBK
结果:乱码! กขค���
场景3: 韩国朋友喊”欧巴”
他的编码:EUC-KR
你的编码:GBK
结果:还是乱码! ����
“为什么编码那么多、那么混乱,就不能发明一种统一的编码吗?”
Unicode:统一编码的救星
🎉 你的梦想成真了!
Unicode(统一码、万国码)诞生了!
🔍 什么是 Unicode?
Unicode 不是一个具体的编码,而是一个概念/标准。
真正实现这个概念的有:
- UTF-7
- UTF-8 ⭐(最常用)
- UTF-16
- UTF-32
🌏 覆盖范围
Unicode 几乎收录了世界上所有的符号:
- 中文、日文、韩文
- 阿拉伯文、泰文、希伯来文
- Emoji 表情 😀
- 各种特殊符号 ©®™
- 古文字、数学符号…
外号:万国码
UTF-8:主宰世界的编码
📊 市场占有率
UTF-8 编码占有率超过 95%
是目前最主流的编码方式!
✨ UTF-8 的优势
- 兼容 ASCII:英文字符依然用 1 Byte
- 变长编码:根据需要使用 1-4 Bytes
- 节省空间:常用字符用更少的字节
- 无乱码:统一标准,全球通用
编码规则:
| 字符范围 | 字节数 | 编码格式 |
|---|---|---|
| ASCII (0-127) | 1 | 0xxxxxxx |
| 其他字符 | 2 | 110xxxxx 10xxxxxx |
| 更多字符 | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| 罕见字符 | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
💡 遇到乱码怎么办?
实用技巧
如果遇到乱码文件,尝试用不同编码打开:
常见编码选项:
- UTF-8(优先尝试)
- GBK / GB2312(中文简体)
- Big5(中文繁体)
- Shift_JIS(日文)
- EUC-KR(韩文)
操作示例:
在文本编辑器中切换编码:
记事本 → 另存为 → 编码选择
VS Code → 右下角点击编码 → 重新打开并选择编码
本文要点回顾
- ✨ 字符编码的本质:数字与字符的对应关系
- ✨ ASCII 码:最早的标准编码,128 个字符,1 Byte
- ✨ 存储原理:字符 → ASCII码 → 二进制 → 硬盘
- ✨ 双字节编码:解决中文等多字符语言的需求
- ✨ 乱码原因:编码和解码使用了不同的对照表
- ✨ Unicode:统一标准,万国码
- ✨ UTF-8:主流编码方式,占有率超过 95%
🎓 进阶知识
为什么 UTF-8 这么流行?
- 向后兼容:完全兼容 ASCII
- 效率高:英文 1 字节,中文 3 字节,灵活高效
- 无字节序问题:UTF-16/32 有大小端之分,UTF-8 没有
- 互联网标准:W3C 推荐,浏览器默认
编程中的编码
// C++ 中处理字符编码
#include <iostream>
#include <locale>
int main() {
// 设置为 UTF-8
std::locale::global(std::locale("zh_CN.UTF-8"));
std::cout << "你好,世界!" << std::endl;
return 0;
}
💡 记住:字符编码就像是计算机和人类之间的”翻译官”。理解了编码,你就理解了计算机如何”说话”。
💬 互动时间
思考题:
- 为什么 Emoji 表情需要更多字节存储?
- 你遇到过最离谱的乱码是什么样的?
如果本文对你有帮助,欢迎:
- 👍 点赞支持
- 🔔 关注不迷路
- 💬 评论区讨论思考题
- ⭐ 收藏慢慢看
你的支持是我创作的最大动力!
本文为”编程学前班”系列第 4 篇
482

被折叠的 条评论
为什么被折叠?



