1. 文件编码的本质差异
第一次用记事本打开一个EXE程序时,满屏的乱码让我意识到文件编码世界的复杂性。文本文件和二进制文件最根本的区别在于:文本文件遵循特定字符编码规则,而二进制文件直接存储原始字节流。
文本文件的核心特征是存在"编码-解码"的转换过程。当我们用记事本保存一个txt文件时,系统会按照指定编码(如UTF-8)将字符转换为二进制序列;读取时又通过相同编码规则还原字符。这个转换过程使得文本文件具有以下特点:
- 必须指定字符编码(ASCII/GBK/UTF-8等)
- 内容可被人类直接阅读(符合编码规则的部分)
- 存在换行符等特殊控制字符的标准化处理
而二进制文件则是赤裸裸的字节序列,没有预设的解析规则。EXE、图片、压缩包等文件都属于此类。它们的特点包括:
- 没有统一的解码规则
- 字节序列对应特定程序才能解释的数据结构
- 包含非文本的任意二进制数据
关键认知:所有文件本质上都是二进制存储,区别在于文本文件有强制性的编码规范约束,而二进制文件将解释权完全交给应用程序。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 编码体系深度解析
2.1 ASCII与扩展编码
ASCII编码用7位二进制(0-127)表示英文字符,是文本文件的鼻祖。但随着多语言需求,出现了各种扩展方案:
-
ISO-8859系列:利用第8位扩展欧洲字符
- ISO-8859-1(Latin-1)覆盖西欧语言
- ISO-8859-5支持西里尔字母
-
GB系列编码:中文特有的双字节方案
- GB2312:6763个汉字
- GBK:扩展至21003字
- GB18030:兼容Unicode的过渡方案
这些编码的共同问题是存在冲突。同一字节在不同编码中可能对应不同字符,这就是乱码的根源。
2.2 Unicode的革命
Unicode通过码点(Code Point)统一全球字符编号,其实现方式主要有三种:
- UTF-32:固定4字节表示,简单但空间浪费
- UTF-16:变长2/4字节,Windows系统内部常用
- UTF-8:兼容ASCII的变长编码(1-4字节)
UTF-8的智能设计使其成为互联网主流:
- ASCII字符保持单字节不变
- 非ASCII字符使用2-4字节编码
