二进制与字符编码

114 阅读5分钟

一、前言

在计算机世界中,一切信息最终都以二进制形式存储和处理。无论是文字、图片、音频还是视频,归根结底都是由 0 和 1 构成的数据流。但人类使用的语言是丰富多彩的字符,这就需要一种机制来将这些字符转换为计算机能识别的二进制码。

这篇文章将带你深入了解:

  • 什么是二进制;
  • 字符编码的发展历程;
  • ASCII、GBK、Unicode、UTF-8 等常见编码的区别;
  • Python 中如何处理编码问题;
  • 实际开发中的编码坑点与解决方案;

通过本文的学习,你将建立起对字符编码的系统性理解,不再惧怕“乱码”、“解码失败”等问题!

二、什么是二进制?

二进制(Binary) 是计算机内部表示数据的基础单位,使用两个数字 01 来表示所有信息。

✅ 计算机为什么用二进制?

  • 物理实现简单:电路只有开和关两种状态,对应 0 和 1;
  • 稳定性强:抗干扰能力强;
  • 逻辑清晰:便于进行布尔运算和位操作。

✅ 一个字节 = 8 位二进制

  • 1 Byte = 8 bits
  • 可表示 2^8 = 25628=256 种不同的状态(即 0~255)

三、字符编码的演变

为了让计算机能够处理人类语言,人们发明了各种字符编码方式,用于将字符映射为对应的二进制数值。

✅ 1. ASCII 编码(American Standard Code for Information Interchange)

  • 诞生时间:1963 年

  • 特点

    • 使用 7 位二进制表示字符(共 128 个)
    • 包括英文大小写字母、数字、标点符号和控制字符
  • 示例

    • 'A' → 65 → 0b01000001
    • 'a' → 97 → 0b01100001

📌 优点:简单高效;缺点:不支持中文等非拉丁字符。

✅ 2. GBK / GB2312 / GB18030(中文编码标准)

  • 适用范围:中国大陆
  • GB2312:1980 年发布,包含 6763 个汉字
  • GBK:1995 年扩展,兼容 GB2312,新增更多汉字
  • GB18030:2000 年国家标准,支持少数民族文字和 Unicode 转换

📌 特点:双字节编码,支持简繁体中文。

✅ 3. Unicode 编码(统一码)

  • 目标:统一全球所有字符的编码
  • 编码空间:0x0000 到 0x10FFFF(约 110 万个字符)
  • 实现方式:多种编码方案,如 UTF-8、UTF-16、UTF-32

📌 Unicode 本身不是编码格式,而是一个字符集,具体传输或存储时需使用某种编码方式。

✅ 4. UTF-8(Unicode Transformation Format – 8-bit)

  • 最流行的 Unicode 编码方式

  • 特点

    • 变长编码(1~4 字节)
    • 向下兼容 ASCII(ASCII 字符在 UTF-8 中保持不变)
    • 高效节省空间
  • 应用广泛

    • Web 开发默认编码
    • JSON、XML、HTML 默认使用 UTF-8
    • Python、Java、C++ 等现代编程语言推荐使用 UTF-8

四、不同编码对比表

编码支持字符字节数是否兼容 ASCII典型应用场景
ASCII英文字符1 字节✅ 是早期英文操作系统
GBK中文简繁1~2 字节❌ 否中文 Windows、旧系统
UTF-8所有 Unicode 字符1~4 字节✅ 是Web、Python、国际化项目
UTF-16Unicode2 或 4 字节❌ 否Java、Windows 内部
UTF-32Unicode4 字节❌ 否内存处理、字符分析

五、Python 中的字符串与编码处理

Python 3 中,默认使用 Unicode 字符串,但在实际读写文件、网络通信时,仍然需要进行编码/解码操作。

✅ 1. 字符串与字节串

s = "你好"        # str 类型,Unicode 字符串
b = s.encode("utf-8")  # bytes 类型,UTF-8 编码后的字节串
print(b)           # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'

✅ 2. 解码字节串为字符串

b = b'\xe4\xbd\xa0\xe5\xa5\xbd'
s = b.decode("utf-8")
print(s)  # 输出:你好

✅ 3. 文件读写中的编码设置

# 写入文件时指定编码
with open("text.txt", "w", encoding="utf-8") as f:
    f.write("你好,世界")

# 读取文件时也需指定编码
with open("text.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

📌 如果不指定 encoding="utf-8",可能会出现乱码或 UnicodeDecodeError。

六、常见的编码错误及解决方法

错误类型原因解决方法
UnicodeEncodeError字符无法用当前编码表示检查输出环境是否支持 Unicode,使用 errors='ignore' 或 'replace'
UnicodeDecodeError字节串不是合法的编码明确指定正确的编码格式(如 'utf-8', 'gbk')
乱码(显示为问号、方块等)编码与解码方式不一致统一使用 UTF-8,确保整个流程编码一致
文件打开报错文件本身不是文本文件使用二进制模式 'rb' 打开并手动处理

七、编码在实际开发中的重要性

✅ 1. Web 开发

  • HTTP 头部应声明 Content-Type: text/html; charset=utf-8
  • HTML 页面使用 <meta charset="UTF-8">
  • 数据库连接需指定编码(如 MySQL 设置 charset=utf8mb4

✅ 2. 网络爬虫

  • 获取网页内容后必须正确解码响应内容(response.content 为 bytes)
  • 有时需从 HTML 中提取真实编码(如 meta 标签)
import requests
res = requests.get("https://example.com")
html = res.content.decode("utf-8")  # 正确解码

✅ 3. 日志记录

  • 日志文件建议使用 UTF-8 编码保存
  • 避免日志中出现乱码影响排查问题

八、总结对比表

技术点推荐做法
默认编码使用 UTF-8
字符串处理Python 3 的 str 是 Unicode,bytes 是字节串
文件读写显式指定 encoding="utf-8"
网络通信发送前 encode,接收后 decode
多语言支持使用 Unicode + UTF-8,避免平台依赖

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!