数据结构-字符编码

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

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字符集涵盖了几乎所有世界上使用的语言,包括但不限于以下几个主要类别:

  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 。

相关推荐
码农小野12 分钟前
基于SpringBoot的自习室预订系统
java·spring boot·后端
liangbm317 分钟前
MATLAB系列02:MATLAB基础
开发语言·数据结构·笔记·matlab·教程·工程基础·高级绘图
ac-er88881 小时前
如何在Flask中实现国际化和本地化
后端·python·flask
Adolf_19931 小时前
Flask-WTF的使用
后端·python·flask
mingzhi612 小时前
网安面试会问到的:http的长连接和短连接
http·面试·职场和发展
我要学编程(ಥ_ಥ)2 小时前
双指针算法专题(2)
数据结构·算法·leetcode
极客先躯3 小时前
高级java每日一道面试题-2024年9月16日-框架篇-Spring MVC和Struts的区别是什么?
java·spring·面试·mvc·struts2·框架篇·高级java
我要学编程(ಥ_ಥ)4 小时前
滑动窗口算法专题(1)
java·数据结构·算法·leetcode
大油头儿4 小时前
排序算法-冒泡排序
数据结构·算法·排序算法
真的很上进4 小时前
【Git必看系列】—— Git巨好用的神器之git stash篇
java·前端·javascript·数据结构·git·react.js