跳到主要内容

文本转二进制到底在做什么:从一个字符到一串 0 和 1

讲清文本转二进制的底层原理:每个字符如何按 ASCII 或 UTF-8 编码成字节,为什么按 8 位一组,中文多字节又是怎么回事,配真实输入输出例子。

发布于 作者 李雷
#二进制 #字符编码 #UTF-8 #编程基础

文本转二进制到底在做什么:从一个字符到一串 0 和 1

把一句话变成一长串 0 和 1,看着像魔术,其实每一步都有据可查。计算机内部不存「字母」,只存电压的高低,也就是 0 和 1。所谓文本转二进制,本质就是查一张约定好的对照表:每个字符对应一个编号,再把这个编号写成二进制。理解这个过程,你就理解了文件大小、乱码、网络传输这些日常问题的根。

字符其实是一个编号

屏幕上的「A」对人来说是一个字母,对机器来说是一个数字。在 ASCII 这张表里,大写 A 的编号是 65。把 65 写成二进制就是 01000001。换句话说,A = 65 = 01000001,这三种写法说的是同一件事。小写 a 是 97,空格是 32,数字字符「0」是 48。这些不是随便定的,而是 1960 年代定下、沿用至今的约定。

想随手查一个字符的编号,我一般直接翻 ASCII 对照表,比背口诀靠谱得多。

为什么是 8 位一组

一个 ASCII 字符的编号最大到 127,7 位二进制就够了。但计算机以字节为最小存取单位,而一个字节是 8 位,所以习惯上把每个字符补满到 8 位,前面用 0 占位。65 本来是 1000001(7 位),补成字节就是 01000001(8 位)。

8 位一组还有个好处:读起来不容易错位。一串没有分隔的比特流人眼很难数,而每 8 位切一刀,就能一块一块对照解码。这也是为什么二进制输出常写成「01001000 01101001」这种带空格的形式。

一个真实例子:Hi 怎么变成二进制

拿「Hi」走一遍。H 的 ASCII 编号是 72,i 是 105。

  • H = 72 = 01001000
  • i = 105 = 01101001

拼起来就是:01001000 01101001。反过来,如果同事在群里甩你一串「01001000 01101001」却不说是啥,把它粘进 文本转二进制工具 的「二进制 → 文字」模式,工具自动忽略空格,「Hi」立刻还原。不用手数比特,也不用开 Python。

我自己第一次彻底搞懂这套逻辑,是写一个解析器调 bug 的时候。代码遇到带声调的名字就乱码,我把「José」按 UTF-8 转成二进制,再反向解回去,发现工具能干净往返而我的代码把「é」吃掉了,问题立刻定位到字节处理那一段,而不是数据本身。那次之后我才真正明白:二进制不是黑盒,是可以一位一位核对的。

中文为什么不止一个字节

ASCII 只能表示 128 个字符,英文字母、数字、常见符号刚好够用,但放不下汉字。现代默认的编码是 UTF-8,它是变长的:0 到 127 的字符仍只占 1 字节(和 ASCII 完全兼容),而高于这个范围的字符要用 2 到 4 字节。

大多数汉字落在 3 字节区。比如「李」是 Unicode 码点 U+674E,UTF-8 编码后是 11100110 10011101 10001110,整整 24 位。所以别被「一个字」骗了,「A」是 8 位,「李」却是 24 位,这不是 bug,是 UTF-8 的设计。BMP 之外的 emoji 更长,「🎉」要 4 字节 32 位。

这里有个常见误区:以为「李」是一个字就该是 16 位。UTF-8 给它的是 24 位;只有当你真的需要固定 2 字节宽度时,才会去选 UTF-16。还有人指望 ASCII 模式处理「café」或「李」,但严格 7 位 ASCII 对超出范围的字符按设计直接报错,任何非英文都得切到 UTF-8。

它能用来做什么

这套转换看着抽象,用处却很具体。

教学上,它是讲编码最直观的道具:输入「你好 🎉」,切到 8 位分组,emoji 当场撑成四个字节,学生立刻明白为什么一个看着不长的字符串会占这么多空间。趣味上,它能给密室逃脱、解谜游戏做二进制谜题,把一句线索编成整齐的字节块印在卡片上。工程上,它帮你验证自己写的编解码器对不对,转一遍再解回来,对得上就说明数据没问题。

想看其他编码方式怎么玩,可以对照试试 Base64 编码工具摩尔斯电码翻译,它们和二进制是同一类思路的不同变体。所有转换都在浏览器本地完成,文字不上传、不记录,粘私密内容也不留痕。

理解了文本到二进制这一步,你就握住了字符编码的钥匙:文件为什么这么大、乱码从哪来、为什么 UTF-8 占了网页的九成以上,答案都藏在这一串 0 和 1 里。


Made by Toolora · Updated 2026-06-13