ASCII、Unicode 与文本表示
了解文本如何转换为字节,以及字符编码为何在密码学环境中十分重要
ASCII、Unicode 与文本表示 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
作为 7 位编码的 ASCII
ASCII(美国信息交换标准代码)于 1963 年标准化,使用 7 位编码 128 个字符(值为 0-127)。它涵盖英文字母(大写和小写)、数字、标点符号和控制字符。
ASCII 是为英语和美国电信设备设计的。对于预期用途,它运行良好;但对于英语以外的任何语言,它从根本上都不够用。
ASCII 中的控制字符
前 32 个 ASCII 字符(0-31)以及 DEL(127)都是控制字符。它们最初用于控制电传打字机:LF(换行,10)、CR(回车,13)、BEL(响铃,7)、TAB(9)、ESC(27)。
在密码学场景中,控制字符可能引发问题。空字节(0x00)会提前终止 C 字符串,而 DEL 或 ESC 字符可能会被终端仿真器解释。
扩展 ASCII 及其问题
不同国家使用第 8 位(值为 128-255)创建了各自的 ASCII 扩展,从而产生了数百种彼此不兼容的编码:西欧使用的 ISO-8859-1(Latin-1)、俄语使用的 KOI-8R,以及中文使用的 Big5。
使用一种编码保存的文档,使用另一种编码打开时会显示为乱码。由于缺乏统一标准,整个 20 世纪 80 年代和 90 年代的国际软件开发都面临着重大挑战。
作为通用字符集的 Unicode
Unicode 的创建目的是提供一个涵盖所有人类书写系统的统一通用字符集。目前它定义了超过 149,000 个字符,覆盖 161 种文字,其中包括历史文字和符号。
Unicode 将字符身份(代码点,例如表示 "A" 的 U+0041)与编码(该代码点如何存储为字节)分开。这种分离允许多种编码格式表示相同的字符。
UTF-8 可变长度编码
UTF-8 使用 1 到 4 个字节编码 Unicode 代码点。ASCII 字符(U+0000 到 U+007F)恰好使用 1 个字节,并且与其 ASCII 值相同,因此 UTF-8 向后兼容 ASCII。
U+0080 到 U+07FF 的字符使用 2 个字节。U+0800 到 U+FFFF 使用 3 个字节(涵盖包括中文、日文和韩文在内的大多数常用文字)。U+10000 及以上的字符使用 4 个字节。
UTF-16 和 UTF-32
UTF-16 对最常用的字符(基本多文种平面,U+0000 到 U+FFFF)使用 2 个字节,对超出 U+FFFF 的字符使用 4 个字节(代理对)。Windows 和 Java 在内部使用它。
UTF-32 为每个代码点固定使用 4 个字节,因此具有固定宽度,按字符位置进行索引很容易;但对于主要由 ASCII 组成的文本而言会浪费空间。一些内部表示会使用它来实现快速随机访问。
字节顺序标记(BOM)
字节顺序标记(BOM)是放置在文件开头的 Unicode 字符 U+FEFF,用于指示字节顺序和编码。在 UTF-16 中,它可以区分大端序(FE FF)和小端序(FF FE)。
在 UTF-8 中,由于 UTF-8 不存在字节顺序问题,BOM(EF BB BF)并非必需,但某些 Windows 软件仍会添加它。这会在密码学应用中引发问题,因为 BOM 会被当作数据而非标记处理。
编码为何对密码学很重要
密码学哈希函数和 MAC 处理的是字节序列,而不是抽象字符。同一个字符串 "café" 使用 UTF-8 编码时是 4 个字节:63 61 66 C3 A9;使用 Latin-1 编码时也是 4 个字节:63 61 66 E9。
如果两个系统对同一个字符串进行哈希时使用了不同的编码,它们将生成不同的哈希值,身份验证也会失败。密码协议必须明确指定编码,以确保互操作性。
UTF-8 中的表情符号
表情符号是位于补充多文种平面的 Unicode 字符。“咧嘴笑脸”表情符号(U+1F600)在 UTF-8 中编码为 4 个字节:F0 9F 98 80。
在安全场景中,表情符号和全角 Unicode 字符曾被用于同形异义攻击:攻击者利用看起来像 "apple.com" 的 URL "xn--pple-43d.com",诱骗用户访问恶意网站。
Unicode 规范化与密码学
某些字符可以用多种 Unicode 形式表示。“带尖音符的 e”可以是 U+00E9(预组字符),也可以是 U+0065 U+0301(e 后跟组合重音符,分解形式)。它们看起来相同,但具有不同的字节表示。
如果密码系统在哈希之前不对 Unicode 进行规范化,那么视觉上相同的字符串可能会产生不同的哈希值。在对文本执行密码学操作之前,通常建议进行 NFKC 规范化。
为密码学选择正确的编码
实现密码系统时,编码选择是一项必须记录的关键决策。密码应在哈希前编码为 UTF-8。协议字段应在协议规范文档中指定编码。
由编码不匹配导致的互操作性失败,是密码系统中常见的错误来源。如果两个实现以不同方式编码字符串,即使实现的是同一个协议,也可能产生不同的身份验证结果。
UTF-8 编码测验
测试您对 UTF-8 编码的理解。
要点总结:文本编码
ASCII 使用 7 位覆盖 128 个字符。Unicode 为所有人类文字提供统一的代码点空间。UTF-8 使用 1-4 个字节编码 Unicode,其中 ASCII 是占用 1 个字节的子集。
在密码学中,编码很重要,因为哈希函数处理的是字节。同一文本使用不同编码会产生不同的哈希值。在对文本执行密码学操作之前,Unicode 规范化必不可少。
用 AI 导师学习 Cryptology Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 67
- 课程
- 261
常见问题解答
「ASCII、Unicode 与文本表示」课时是免费的吗?
是的 — 「ASCII、Unicode 与文本表示」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「ASCII、Unicode 与文本表示」这节课中我会学到什么?
了解文本如何转换为字节,以及字符编码为何在密码学环境中十分重要 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「ASCII、Unicode 与文本表示」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Base64 编码:工作原理
- ASCII、Unicode 与文本表示
- 密码学输出中的十六进制
- 编码、加密与哈希的区别