编程学前班系列-04-计算机如何存储文字

计算机如何存储文字?从传纸条说起

为什么会有乱码?连工作多年的程序员都没完全搞懂的知识点

为什么 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码二进制
04800110000
95700111001
A6501000001
Z9001011010
a9701100001
z12201111010

字符如何存储到硬盘?

🔑 关键:结合前面的知识

还记得我们前面学过的吗?

  1. 计算机使用二进制存储数据
  2. 硬盘就像一张巨大的纸,上面只能写 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 存储过程

从大写字母 AZ,依次存储到硬盘:

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 的优势

  1. 兼容 ASCII:英文字符依然用 1 Byte
  2. 变长编码:根据需要使用 1-4 Bytes
  3. 节省空间:常用字符用更少的字节
  4. 无乱码:统一标准,全球通用

编码规则:

字符范围字节数编码格式
ASCII (0-127)10xxxxxxx
其他字符2110xxxxx 10xxxxxx
更多字符31110xxxx 10xxxxxx 10xxxxxx
罕见字符411110xxx 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 这么流行?

  1. 向后兼容:完全兼容 ASCII
  2. 效率高:英文 1 字节,中文 3 字节,灵活高效
  3. 无字节序问题:UTF-16/32 有大小端之分,UTF-8 没有
  4. 互联网标准: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;
}

💡 记住:字符编码就像是计算机和人类之间的”翻译官”。理解了编码,你就理解了计算机如何”说话”。


💬 互动时间

思考题:

  1. 为什么 Emoji 表情需要更多字节存储?
  2. 你遇到过最离谱的乱码是什么样的?

如果本文对你有帮助,欢迎:

  • 👍 点赞支持
  • 🔔 关注不迷路
  • 💬 评论区讨论思考题
  • ⭐ 收藏慢慢看

你的支持是我创作的最大动力!


本文为”编程学前班”系列第 4 篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乡野码圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值