二进制是计算机存储和传输一切数据的底层形式。每个字符——无论是字母、数字还是 Emoji——都以 0 和 1 的序列存储。本文介绍文本到二进制的转换原理、UTF-8 多字节编码机制,并提供在线工具和代码示例。
文本如何转换为二进制
每个字符通过字符编码标准映射为一个数字,再将该数字表示为二进制(2 进制)。现代系统普遍使用 UTF-8,它向下兼容 ASCII 并支持完整的 Unicode 字符集。
ASCII 字符(每个 1 字节)
标准 ASCII 字符(码位 0–127)每个字符恰好对应 1 个字节(8 位):
H = 72 = 01001000
e = 101 = 01100101
l = 108 = 01101100
l = 108 = 01101100
o = 111 = 01101111
“Hello” 的带空格二进制:
01001000 01100101 01101100 01101100 01101111
如何手动解读一个字节
01001000
↑↑↑↑↑↑↑↑
每一位对应 2 的幂次,从右到左:
位置:7 6 5 4 3 2 1 0
值: 0 +64+ 0 + 0 + 8 + 0 + 0 + 0 = 72 = 'H'
UTF-8 多字节字符
UTF-8 采用变长编码,ASCII 范围之外的字符需要 2、3 或 4 个字节:
| 码位范围 | 字节数 |
|---|---|
| U+0000 – U+007F | 1 字节(ASCII) |
| U+0080 – U+07FF | 2 字节 |
| U+0800 – U+FFFF | 3 字节(大部分中日韩字符) |
| U+10000 – U+10FFFF | 4 字节(Emoji、生僻文字) |
示例:
© (U+00A9) = 2 字节:11000010 10101001
中 (U+4E2D) = 3 字节:11100100 10111000 10101101
😀 (U+1F600) = 4 字节:11110000 10011111 10011000 10000000
这就是为什么同样是”一个字符”,产生的 8 位组数量却不同——取决于其在 Unicode 表中的位置。
在线文本转二进制工具
最快的方式——直接在浏览器中转换,无需安装:
- 粘贴文本 → 二进制实时更新
- 支持带空格(01001000 01100101…)和连续(0100100001100101…)两种格式
- 粘贴二进制 → 点击 Binary → Text 还原文本
- 全部在浏览器内运行,不上传任何数据
代码实现
JavaScript(浏览器)
使用浏览器原生的 TextEncoder API:
function textToBinary(text) {
const encoder = new TextEncoder(); // 默认 UTF-8
const bytes = encoder.encode(text);
return Array.from(bytes)
.map(byte => byte.toString(2).padStart(8, '0'))
.join(' ');
}
console.log(textToBinary('你好'));
// 11100111 10111101 10100000 11100101 10100101 10111101
console.log(textToBinary('Hi'));
// 01001000 01101001
二进制还原文本:
function binaryToText(binary) {
const bytes = binary
.trim()
.replace(/\s+/g, ' ')
.split(' ')
.map(b => parseInt(b, 2));
const decoder = new TextDecoder('utf-8');
return decoder.decode(new Uint8Array(bytes));
}
console.log(binaryToText('11100111 10111101 10100000 11100101 10100101 10111101'));
// 你好
Python
def text_to_binary(text: str) -> str:
return ' '.join(format(b, '08b') for b in text.encode('utf-8'))
def binary_to_text(binary: str) -> str:
parts = binary.strip().split()
return bytes(int(b, 2) for b in parts).decode('utf-8')
print(text_to_binary('你好'))
# 11100111 10111101 10100000 11100101 10100101 10111101
print(binary_to_text('01001000 01100101 01101100 01101100 01101111'))
# Hello
命令行(一行搞定)
python3 -c "
import sys
text = sys.argv[1]
print(' '.join(format(b, '08b') for b in text.encode('utf-8')))
" "你好世界"
带空格 vs 连续格式
| 格式 | 示例 | 适用场景 |
|---|---|---|
| 带空格 | 01001000 01100101 | 人类可读,每字节独立 |
| 连续 | 0100100001100101 | 紧凑,部分协议使用 |
解码连续格式时,字符串长度必须是 8 的倍数,否则说明二进制不完整或格式错误。
常见应用场景
教学与学习 — 二进制编码是计算机科学的基础概念。把自己的名字转成二进制,能直观感受字符与字节的对应关系。
调试编码问题 — 出现乱码时,查看原始二进制有助于定位问题所在:是编码解码不一致、多字节序列被截断,还是存在 BOM 字符。
CTF 安全竞赛 — 文本与二进制的互转是 CTF 题目中的常见操作,隐藏信息经常以二进制编码出现。
网络协议与文件格式开发 — 理解字符到字节的映射,在设计二进制协议或解析文件格式时至关重要。
二进制与其他编码的对比
| 编码方式 | ”Hi” 的输出 | 体积 | 可读性 |
|---|---|---|---|
| 二进制 | 01001000 01101001 | 最大 | 极低 |
| 十六进制 | 48 69 | 紧凑 | 中等 |
| Base64 | SGk= | 约为原始的 4/3 | 较高 |
| ASCII 十进制 | 72 105 | 紧凑 | 中等 |
需要文本安全的紧凑编码时,推荐 Base64 工具。需要同时查看十进制、十六进制、八进制时,推荐 ASCII 转换器。
小结
- 文本转二进制:将每个字符按 UTF-8 编码为字节,再将每个字节表示为 8 位二进制。
- ASCII 字符占 1 字节;Emoji 和大多数中文字符占 2–4 字节。
- 带空格格式以空格分隔每个字节;连续格式无分隔符。
- JavaScript 用
TextEncoder/TextDecoder,Python 用.encode('utf-8')。