字符编码是一种将字符映射为二进制数据的方法。它的出现源远流长,最早可以追溯到电报时代。随着计算机科学的发展,不同的字符编码标准相继出现。
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值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | \ | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
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字符集涵盖了几乎所有世界上使用的语言,包括但不限于以下几个主要类别:
- 拉丁字母:Unicode包含了大写和小写的拉丁字母,涵盖了英语、法语、西班牙语、德语等欧洲语言。
- 非拉丁字母:Unicode还包括了许多非拉丁字母,如希腊字母、俄罗斯字母、阿拉伯字母、希伯来字母、泰米尔字母等。
- 亚洲字符:Unicode覆盖了亚洲语言的字符,包括中文、日文、韩文、泰文、印度语等。
- 表意文字:Unicode还涵盖了表意文字,如汉字、日本的假名、朝鲜的谚文、藏文等。
- 符号和表情符号:Unicode包含了各种符号,如数学符号、货币符号、技术符号、箭头、几何形状等。此外,还包括了各种表情符号和图形符号,如笑脸、动物、食物等。
Unicode的不断发展和更新使其能够涵盖新的字符和符号。每当有新的字符需要被编码时,Unicode联盟会考虑并分配新的代码点。在庞大的 Unicode 字符集中,常用的字符占用 2 字节,有些生僻的字符占 3 字节甚至 4 字节。
UTF-8 编码
UTF-8(Unicode Transformation Format-8)是一种常见的Unicode字符编码方案,它是一种可变长度编码,可以表示Unicode字符集中的所有字符。
UTF-8的编码规则如下:
-
对于ASCII字符(U+0000至U+007F),UTF-8使用单字节表示,与ASCII编码完全兼容。这意味着ASCII字符在UTF-8中保持不变,可以直接使用。
-
对于非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 。