likes
comments
collection
share

数据结构-字符编码

作者站长头像
站长
· 阅读数 17

字符编码是一种将字符映射为二进制数据的方法。它的出现源远流长,最早可以追溯到电报时代。随着计算机科学的发展,不同的字符编码标准相继出现。

ASCII

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的字符编码标准之一,于1963年由美国国家标准学会(ANSI)首次发布。ASCII编码使用7位二进制数(后来扩展为8位),将常见的英文字母、数字、标点符号和控制字符映射为唯一的编码。

ASCII编码共定义了128个字符,包括英文字母(大写和小写)、数字(0-9)、标点符号(如句号、逗号和问号)以及一些控制字符(如换行符和回车符)。这使得ASCII编码在早期计算机系统中广泛使用,特别是在英语为主要语言的环境中。

ASCII编码的设计初衷是为了在计算机之间传输文本数据,确保数据的一致性和互操作性。由于ASCII编码只使用了7位或8位二进制数,因此它的编码空间有限,无法表示其他语言的字符,如非拉丁字母、汉字和日文假名等。这限制了ASCII的国际化应用。

ASCII码表如下:

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

GBK字符集

GBK(Guojia Biaozhun Kuozhan,国家标准扩展)字符集是汉字字符编码标准之一,是对GB2312字符集的扩展。它是在GB2312的基础上增加了更多的汉字和符号,以满足中文处理的需求。

GBK字符集采用双字节编码方案,每个字符使用两个字节来表示。其中,高字节位于0x81-0xFE之间,低字节位于0x40-0xFE之间,排列组合形成了一个字符区域矩阵。GB2312中的字符位于GBK的第一个区域,而新增的字符则位于其它区域。

GBK字符集共收录了21003个汉字(包括繁体字和异体字)、图形符号、标点符号、拉丁字母等,覆盖了大部分中文字符的使用需求。它广泛应用于简体中文的计算机系统、操作系统、数据库和互联网等领域。

值得注意的是,GBK字符集仅适用于简体中文,对于其他语言的字符并没有涵盖。对于包含繁体中文或其他非中文字符的文本,GBK字符集可能无法正确表示或解析。

Unicode字符集

Unicode的出现是为了解决字符编码的多样性和国际化的需求。在过去,不同的计算机和操作系统使用各自独立的字符编码标准,导致在跨平台和跨语言的信息交流中存在许多问题。为了统一字符编码,并能够表示全球范围内的所有字符,Unicode应运而生。

Unicode字符集是一个全球性的字符编码标准,旨在涵盖世界上几乎所有的字符。它包含了各种语言的字母、数字、标点符号、符号、表情符号、技术符号、数学符号、货币符号等。

Unicode字符集以十六进制表示字符编码,每个字符都有一个唯一的编号,称为Unicode代码点。代码点范围从U+0000到U+10FFFF,共计1,114,112个可能的代码点。

Unicode字符集涵盖了几乎所有世界上使用的语言,包括但不限于以下几个主要类别:

  1. 拉丁字母:Unicode包含了大写和小写的拉丁字母,涵盖了英语、法语、西班牙语、德语等欧洲语言。
  2. 非拉丁字母:Unicode还包括了许多非拉丁字母,如希腊字母、俄罗斯字母、阿拉伯字母、希伯来字母、泰米尔字母等。
  3. 亚洲字符:Unicode覆盖了亚洲语言的字符,包括中文、日文、韩文、泰文、印度语等。
  4. 表意文字:Unicode还涵盖了表意文字,如汉字、日本的假名、朝鲜的谚文、藏文等。
  5. 符号和表情符号:Unicode包含了各种符号,如数学符号、货币符号、技术符号、箭头、几何形状等。此外,还包括了各种表情符号和图形符号,如笑脸、动物、食物等。

Unicode的不断发展和更新使其能够涵盖新的字符和符号。每当有新的字符需要被编码时,Unicode联盟会考虑并分配新的代码点。在庞大的 Unicode 字符集中,常用的字符占用 2 字节,有些生僻的字符占 3 字节甚至 4 字节。

数据结构-字符编码

UTF-8 编码

UTF-8(Unicode Transformation Format-8)是一种常见的Unicode字符编码方案,它是一种可变长度编码,可以表示Unicode字符集中的所有字符。

UTF-8的编码规则如下:

  1. 对于ASCII字符(U+0000至U+007F),UTF-8使用单字节表示,与ASCII编码完全兼容。这意味着ASCII字符在UTF-8中保持不变,可以直接使用。

  2. 对于非ASCII字符,UTF-8使用多个字节来表示。UTF-8的编码长度可以是1到4个字节,根据字符的范围和复杂度而变化。

    • 以0开头的字节表示单字节字符。
    • 以110开头的字节表示双字节字符。
    • 以1110开头的字节表示三字节字符。
    • 以11110开头的字节表示四字节字符。

    后续字节(如果有)以10开头。

通过这种编码方式,UTF-8能够灵活地表示不同范围和复杂度的字符,并且保留了与ASCII编码的兼容性。这使得UTF-8成为互联网和计算机系统中最常用的字符编码方案之一。

UTF-8的优势包括:

  • 节省存储空间:对于ASCII字符,UTF-8使用单字节编码,与ASCII编码完全相同,不会增加存储开销。只有在需要表示非ASCII字符时,才使用多字节编码,可以节省存储空间。
  • 兼容性:UTF-8兼容ASCII编码,因此现有的ASCII文本可以无需转换直接使用UTF-8编码。
  • 国际化支持:UTF-8可以表示全球范围内的字符,包括不同语言的字母、符号、表意文字等。它成为了互联网上多语言文本交流的事实标准。
  • 网络传输效率:由于UTF-8编码的特性,对于英文等ASCII字符密集的文本,UTF-8的传输效率往往优于其他固定长度编码方案。

UTF-8与Unicode编码对比

数据结构-字符编码 除了 UTF-8 之外,常见的编码方式还包括以下两种。

  • UTF-16 编码:使用 2 或 4 个字节来表示一个字符。所有的 ASCII 字符和常用的非英文字符,都用 2 个字节表示;少数字符需要用到 4 个字节表示。对于 2 字节的字符,UTF-16 编码与 Unicode 码点相等。
  • UTF-32 编码:每个字符都使用 4 个字节。这意味着 UTF-32 会比 UTF-8 和 UTF-16 更占用空间,特别是对于 ASCII 字符占比较高的文本。

从存储空间的角度看,使用 UTF-8 表示英文字符非常高效,因为它仅需 1 个字节;使用 UTF-16 编码某些非英文字符(例如中文)会更加高效,因为它只需要 2 个字节,而 UTF-8 可能需要 3 个字节。

从兼容性的角度看,UTF-8 的通用性最佳,许多工具和库都优先支持 UTF-8 。