在计算机中显示文字信息时,需要将字符(如字母、数字、标点符号、汉字等)转换成计算机能够存储和处理的二进制数字(0和1),这个转换规则就是字符编码。
以下是一些最常用和重要的字符编码标准:
1. ASCII (美国信息交换标准代码)
基础: 最早的、最基础的编码标准之一。
范围: 仅支持128个字符(0-127),包括基本的英文字母(大小写)、数字、标点符号以及一些控制字符(如换行、回车)。
特点: 每个字符占用1个字节(8位,但最高位固定为0,实际只用7位)。
局限性: 无法表示非英语字符(如中文、日文、德语的变音符号等)。
2. 扩展ASCII / 8位编码
目的: 解决ASCII无法表示更多字符的问题。
实现: 利用ASCII中未使用的最高位(第8位),将字符集扩展到256个字符(0-255)。
问题: 这128个扩展字符位没有统一标准!不同语言/地区定义了不同的扩展字符集(称为代码页),例如:
ISO-8859 系列: 针对不同欧洲语言(如ISO-8859-1 拉丁字母西欧语言)。
Windows 代码页: 如CP1252(西欧)、CP1251(西里尔字母)、CP936(简体中文GBK)等。
问题: 不同代码页之间互不兼容,导致乱码问题非常普遍。一个文件在一种代码页下显示正常,换到另一个代码页下就可能全是乱码。
3. Unicode (统一码、万国码)
目标: 解决全球所有语言字符统一编码的问题,一统江湖。
核心思想: 为世界上几乎所有的书写系统中使用的每一个字符分配一个唯一的数字编号(称为码位)。
范围: 极其庞大,不断扩展,目前已包含超过14万个字符,涵盖几乎所有现代和许多古代文字系统。
实现方式: Unicode本身只定义了字符和码位的映射关系。实际存储和传输时,需要将码位转换成字节序列,这就有多种Unicode 转换格式:
UTF-8:
最流行、最推荐的Unicode编码。
变长编码: 每个字符使用1到4个字节表示。ASCII字符(0-127)只需1个字节,且编码与ASCII完全相同(兼容性极好)。
高效: 对于主要包含拉丁字母(如英文)的文本,非常节省空间。
无字节序问题: 字节序列没有依赖特定平台的字节顺序(大端序/小端序)。
广泛应用: Web(HTML、XML默认)、操作系统(Linux、m ac OS默认,Windows也广泛支持)、数据库、编程语言等。
UTF-16:
每个字符通常使用2个字节(基本多文种平面字符)或4个字节(辅助平面字符)。
在内存中处理Unicode字符串时效率较高(尤其对于包含大量BMP外字符的文本)。
存在字节序问题(UTF-16LE小端序 / UTF-16BE大端序),通常需要BOM(字节顺序标记)来标识。
广泛应用: Windows操作系统内部、Java、JavaScript(早期)等。
UTF-32:
每个字符固定使用4个字节。最直接、最简单的编码方式。
空间浪费严重(尤其是英文文本)。
也存在字节序问题(UTF-32LE / UTF-32BE)。
应用较少: 主要用于需要直接操作码位的特殊场景,内存处理效率最高(固定宽度)。
4. 特定语言/地区的传统编码 (在逐渐被Unicode取代,但仍有大量遗留系统使用)
中文:
GB2312: 早期简体中文国家标准,包含约6700个汉字。
GBK: GB2312的扩展,包含约2 10 00个汉字,兼容GB2312。
GB18030: 最新国家标准,完全兼容GBK,并支持Unicode中的所有字符(通过变长编码实现,1/2/4字节)。
Big5: 繁体中文地区(台湾、香港、澳门)的主要编码标准。
日文:
Shift_JIS: 微软Windows等系统常用。
EUC-JP: Unix/Linux系统常用。
韩文:
EUC-KR: 常用编码。
总结关键点:
编码是字符到二进制数字的映射规则。
ASCII是基础,但只能表示英文等有限字符。
扩展ASCII/代码页解决了部分问题,但导致了严重的乱码和兼容性问题。
Unicode是终极解决方案,旨在涵盖全球所有字符。
UTF-8是Unicode在存储和传输中最主流的实现方式,因其兼容性、效率和广泛支持而备受推崇。
选择正确的编码对正确显示文字至关重要。 如果打开文件或网页时使用的解码方式与它实际使用的编码不一致,就会产生乱码。现代软件通常能自动检测编码,但并非总是100%准确。
当你看到计算机屏幕上显示的文字时,背后都有一套复杂的编码和解码过程在默默工作,确保那些0和1能变成你认识的字词。