字符编码与 Unicode:UTF-8、UTF-16 及其他编码终极指南
在计算机发展的早期,表示文本非常简单:每个字符都占用 7 或 8 位 (ASCII)。但随着计算机走向全球,我们需要一种方式来表示世界上每种语言的每个字符。这就是 Unicode 及其背后的编码技术诞生的故事。
1. Unicode 标准
Unicode 本身不是一种编码,而是一个通用的字符集。它为每个字符分配了一个唯一的数字,称为码点(例如,U+0041 代表 'A')。然而,我们仍然需要一种方法将这些数字存储为二进制数据。
UTF-8(互联网之王)
UTF-8 是一种变长编码,每个字符使用 1 到 4 个字节。它向后兼容 ASCII。
- 优点:对于西方语言非常高效,对数据损坏具有鲁棒性,是互联网的通用标准。
UTF-16
使用 2 或 4 个字节。它是 Windows (NTFS) 以及 Java 和 JavaScript 等许多编程环境的内置编码。
UTF-32
每个字符固定使用 4 个字节。虽然索引简单,但非常浪费内存。
2. 遗留及地区编码
在 Unicode 成为主流之前,不同地区使用自己的标准,其中许多标准至今仍在使用。
中文字符集(GB 家族)
- GB2312:早期的简体中文标准。
- GBK:GB2312 的扩展,支持更多字符。
- GB18030:中国目前的强制性标准,支持简体和繁体中文,并与 Unicode 完全映射。
日语编码
- Shift-JIS:历史上最流行的日语编码,广泛用于 Windows 和旧版网站。
韩语与繁体中文
- EUC-KR:韩语常用的遗留编码。
- Big5:繁体中文的标准,主要用于台湾和香港。
3. 西方遗留编码
ISO-8859-1 (Latin-1)
涵盖大多数西欧语言的 8 位编码。
Windows-1252
ISO-8859-1 的微小变体,是旧版本 Windows 的默认编码。
4. 技术细节:BOM 与字节序
字节顺序标记 (BOM)
BOM 是文本文件开头的一组特殊字节序列(例如 UTF-8 的 EF BB BF)。它告诉软件正在使用哪种编码和字节序。虽然对 UTF-16 很有用,但在 Web 环境中通常不建议在 UTF-8 中使用 BOM。
小端序 (Little Endian) 与 大端序 (Big Endian)
这与 UTF-16 和 UTF-32 相关,指字节在内存中存储的顺序。
对比总结
| 编码 | 每字符字节数 | 兼容性 | 最佳用途 |
|---|---|---|---|
| UTF-8 | 1-4 | ASCII | Web, Linux, Mac |
| UTF-16 | 2 或 4 | 无 | Windows, Java, JS |
| GB18030 | 1, 2, 或 4 | GBK | 中国政府合规性 |
| ASCII | 1 | 通用 | 遗留系统、纯英文 |
结论
全球已基本达成共识,将 UTF-8 作为数据交换的标准。然而,在处理遗留系统或特定地区的软件时,了解 GBK 或 Shift-JIS 等遗留编码仍然至关重要。如有疑问,在现代应用中请始终使用不带 BOM 的 UTF-8。