ASCII

American Standard Code for Information Interchange,美国信息互换标准代码

共收录了 128 ( )个字符,用一个字节就可以存储,详见 ASCII码表

扩展ASCII

扩展ASCII码使用8位二进制数,因此可以表示  个字符,扩展ASCII码的关键在于这后128个字符的定义

由于没有一个统一的标准,不同的厂商、操作系统或应用程序会根据自己的需求定义这部分字符

为了管理这些不同的扩展ASCII码方案,引入了“编码页”的概念。每个编码页都定义了128-255范围内的字符映射。例如,常见的编码页有:

  • CP437 (IBM PC Code Page 437):这是最早也是最著名的扩展ASCII码之一,由IBM PC使用,包含了图形字符、数学符号和一些欧洲语言字符。
  • ISO 8859系列:国际标准化组织(ISO)制定了一系列用于表示各种欧洲语言的8位编码标准,如ISO 8859-1(Latin-1,用于西欧语言)、ISO 8859-2(Latin-2,用于中欧和东欧语言)等。
  • Windows Code Pages (如CP1252):Microsoft Windows操作系统也定义了自己的编码页,如CP1252,它是ISO 8859-1的扩展,增加了一些额外的字符。详见 Windows-1252 编码表

GB系列

国标码,中国国家标准局制定的汉字编码标准

GB2312

《信息交换用汉字编码字符集 基本集》,发布于1980年,采用双字节编码

共收录了7445个字符,包括:

  • 6763个常用汉字(一级汉字3755个,二级汉字3008个)
  • 682个非汉字字符(包括拉丁字母、希腊字母、俄语字母、日文平假名和片假名,以及数字、标点符号等)

GB2312采用“区位码”的概念来组织汉字,每个汉字都由一个两位十进制数表示的区号和一个两位十进制数表示的位号来唯一标识。例如,“啊”字的区位码是1601。

将区位码转换为十六进制,然后加上偏移量得到最终的编码。具体来说,区号和位号分别加上A0H(十六进制),形成两个字节。例如,“啊”的区位码是1601,转换为十六进制是1001H。区号16H加上A0H得到B0H,位号01H加上A0H得到A1H。所以“啊”的GB2312编码是B0A1H。

GB2312的编码范围避开了ASCII码的范围,因此可以与ASCII字符混合使用。ASCII字符仍然使用单字节编码。

GBK

《汉字内码扩展规范》,发布于1995年,采用双字节编码

GBK是GB2312的扩展,它完全兼容GB2312

共收录了21886个字符,包括:

  • 21003个汉字(包括GB2312中的所有汉字,以及大量繁体字、生僻字、日韩汉字等)。
  • 883个非汉字字符。

GB18030

《信息技术 中文编码字符集》,发布于2000年(2005年修订),采用变长多字节编码(单字节、双字节、四字节)

GB18030是GBK的扩展,并且是强制性的国家标准。它旨在统一中国大陆所有的中文编码

 理论上可以收录Unicode的所有码点(即可以表示超过160万个字符),目前已收录了7万多个汉字,包括:

  • GBK中的所有汉字。
  • 大量少数民族文字(如藏文、蒙文、维吾尔文等)。
  • 更多的生僻字。

GB18030是变长编码,这意味着它可以使用1个字节、2个字节或4个字节来表示一个字符。

  • 单字节:与ASCII码兼容,表示ASCII字符。
  • 双字节:与GBK兼容,表示GBK中的汉字和符号。
  • 四字节:用于表示GBK中未包含的字符,包括Unicode扩展区的字符。

强制性标准: 中国大陆的操作系统、软件和硬件产品在支持中文时,必须支持GB18030。

Unicode

统一码,旨在包含世界上所有字符的编码标准,为每个字符分配一个唯一的数字(码点)

这是一个字符集,它为世界上几乎所有的字符(包括各种语言的文字、符号、表情符号等)分配了一个唯一的数字,称为“码点”(Code Point)。例如,字符 ‘A’ 的码点是 U+0041,字符 ‘中’ 的码点是 U+4E2D。Unicode 本身不关心这些数字如何在计算机中存储,它只提供了一个巨大的字符映射表。

UTF (Unicode Transformation Format): 这是将 Unicode 码点转换为字节序列的编码方案。

UTF-8

变长编码,使用 1 到 4 个字节来表示一个 Unicode 码点

  • 编码规则:

    • 1字节: 0xxxxxxx (U+0000 - U+007F) - 兼容 ASCII。
    • 2字节: 110xxxxx 10xxxxxx (U+0080 - U+07FF) - 主要用于欧洲语言的带音标字符。
    • 3字节: 1110xxxx 10xxxxxx 10xxxxxx (U+0800 - U+FFFF) - 主要用于东亚语言(如中文、日文、韩文)的常用字符。
    • 4字节: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (U+10000 - U+10FFFF) - 用于表示一些生僻字、表情符号和辅助平面字符。
  • 优点:

    • 高效存储 ASCII: 对于英文文本,UTF-8 的存储效率与 ASCII 相同,非常节省空间。
    • 兼容性好: 与 ASCII 的兼容性使得它能够平滑过渡,并且在各种系统和应用中表现良好。
    • 节省空间: 对于包含大量 ASCII 字符和少量非 ASCII 字符的文本,UTF-8 通常比 UTF-16 更节省空间。
  • 缺点:

    • 变长: 变长编码使得随机访问字符(例如,直接跳到第 N 个字符)变得复杂,需要从头开始解析。
    • 非 ASCII 字符可能占用更多空间: 对于中文等字符,UTF-8 使用 3 个字节,而 UTF-16 使用 2 个字节,此时 UTF-16 更节省空间。

UTF-16

变长编码,它使用 2 个或 4 个字节来表示一个 Unicode 码点

  • 编码规则:

    • 2字节: 对于 BMP 字符 (U+0000 - U+FFFF),直接将码点转换为 2 字节表示。
    • 4字节: 对于辅助平面字符 (U+10000 - U+10FFFF),使用一对代理码点(高位代理和低位代理)来表示,每个代理码点占用 2 个字节,总共 4 个字节。
  • 优点:

    • 固定长度(对于 BMP): 对于 BMP 字符,UTF-16 使用固定的 2 字节长度,这使得在处理这些字符时,随机访问和计算字符串长度相对简单。
    • 对于东亚语言更节省空间: 对于中文、日文、韩文等主要位于 BMP 的语言,UTF-16 通常比 UTF-8 更节省空间(2字节 vs 3字节)。
  • 缺点:

    • 不兼容 ASCII: ASCII 字符在 UTF-16 中也需要 2 个字节表示(例如 ‘A’ 是 00 41),这使得它与 ASCII 不兼容,并且对于纯英文文本来说,存储效率是 UTF-8 的两倍。
    • 字节顺序问题: 存在大端序和小端序的困扰,需要 BOM 或其他机制来指示。
    • 变长: 尽管 BMP 字符是固定 2 字节,但辅助平面字符是 4 字节,这仍然使其成为变长编码,随机访问仍然比 UTF-32 复杂。

UTF-32

定长编码,它使用 4 个字节来表示所有 Unicode 码点。

每个 Unicode 码点都直接映射到一个 4 字节的整数值。例如,‘A’ (U+0041) 就是 00 00 00 41,‘中’ (U+4E2D) 就是 00 00 4E 2D

  • 优点:
    • 简单高效的随机访问: 由于每个字符都占用固定的 4 个字节,因此随机访问字符串中的任何字符都非常简单和快速,可以直接通过索引计算偏移量。计算字符串长度也极其简单。
    • 无需解析: 读取字符时无需复杂的解析逻辑。
  • 缺点:
    • 非常浪费空间: 这是 UTF-32 最大的缺点。即使是 ASCII 字符,也需要 4 个字节来存储,比 UTF-8 浪费 3 倍空间,比 UTF-16 浪费 1 倍空间。对于大多数文本来说,大量的字节都是空的(00)。
    • 不兼容 ASCII: 同样不兼容 ASCII。
    • 字节顺序问题: 存在字节顺序问题。

字节顺序问题

 UTF-8 没有字节顺序(Byte Order Mark, BOM)问题,因为它的多字节序列设计本身就包含了顺序信息。虽然有些软件会在 UTF-8 文件的开头添加 BOM (EF BB BF),但这并非 UTF-8 规范所强制要求,有时反而会引起兼容性问题。   UTF-16 存在字节顺序问题。因为一个字符可能由两个或四个字节组成,这些字节在内存中存储的顺序可以是“大端序”(Big-Endian, BE)或“小端序”(Little-Endian, LE)。为了指示字节顺序,UTF-16 文件通常会在开头添加一个 BOM:

  • UTF-16 BE: BOM 是 FE FF
  • UTF-16 LE: BOM 是 FF FE

UTF-32 也存在字节顺序问题,需要 BOM 来指示:

  • UTF-32 BE: BOM 是 00 00 FE FF
  • UTF-32 LE: BOM 是 FF FE 00 00
特性UTF-8UTF-16UTF-32
字节长度1-4 字节(变长)2 或 4 字节(变长)4 字节(定长)
ASCII 兼容(1字节,完全相同)否(2字节,00 XX否(4字节,00 00 00 XX
空间效率对英文高效,对中文一般(3字节)对英文低效,对中文高效(2字节)对所有字符都低效(4字节)
随机访问复杂(变长)较复杂(变长,但BMP固定2字节)简单高效(定长)
字节顺序无(BOM可选但建议不加)有(需要 BOM 或协议约定)有(需要 BOM 或协议约定)
应用场景Web、文件存储、网络传输、操作系统内部字符串处理(如 Java、JavaScript)内存中的字符串处理(对性能要求高)