你按下的每一个字母,计算机都偷偷给它标了号
你有没有想过,当你按下键盘上的字母“A”时,计算机是怎么知道是“A”的呢?可能你觉得这很简单——键盘连上电脑,按什么就出什么呗。但事情没这么浪漫:计算机其实只懂两样东西——0和1。它根本不知道什么是"A"、什么是"B",甚至连字母的概念都没有。那它是怎么把按键识别成文字的?靠的是一本小小的“密码本”:ASCII编码。
ASCII编码本质上就是一张“字符→数字”的对照表。它给每个常用字母、数字、符号都分配了一个0到127之间的唯一数字。比如大写A是65,小写a是97,数字字符'0'是48,空格是32。大小写编号不同,这个细节很重要,后面会用到。
在Python里,翻译这个密码本的工具只有两个函数:ord() 和 chr()。ord('A') 返回65,chr(65) 返回'A'。看似简单,但这是计算机处理文本的基石。几乎所有字符串操作、加密算法、字符比较,底层都依赖这套编码规则。
比如,一道常见的“凯撒密码”问题,就是基于ASCII编码的偏移。题目说:给你一组已破解的明文和密文,以及另一段待破解的密文,让你求出对应的明文。这其实就是在考察你对字符编号和偏移量的理解。破解的关键是:先算出已知的明文和密文之间的偏移量,然后对未知密文反向偏移。
我们不需要完整代码,思路是这样的:读入三行字符串,然后遍历已知明文的每个字符,找到它和对应密文字符的ASCII差值。由于凯撒密码只对字母进行偏移,而且通常大小写分开处理,你需要判断字符是不是字母,再计算偏移。得到偏移量后,再对第三行密文的每个字符做反向偏移(注意字母边界回绕)。代码核心就是 ord() 和 chr() 以及取模运算。
另一道题更直接:输入一个整数(ASCII码),输出对应的字符。这就是 chr() 的裸考。但有意思的是,很多初学者会写 print(chr(65)) 然后得到 'A',却不明白为什么是65。这道题恰好逼你从数字到字符的映射,加深理解。
还有两个判断题:第一个问大写'A'的十进制ASCII码,答案是65;第二个说ASCII可以表示中文,错。ASCII只有128个编码,根本放不下中文字符,中文用的是Unicode(通常UTF-8编码)。这提醒我们:别以为ASCII万能,它只是西方字符的“小本本”。
回到ASCII本身。为什么说它像密码本?因为你把每个字符看作一个数字,就可以做很多“加密”操作。比如凯撒密码就是加一个固定偏移,维吉尼亚密码则是加一个动态偏移。而更底层的,字符比较其实比较的是数字:'A' < 'a' 成立,因为65<97。这些特性都藏在ASCII编码里。
最后给想深入的同学一个建议:不要只停在 ord 和 chr 的表面。可以试试手动实现一个凯撒密码,然后想想如果字符不只是英语字母,扩展到全ASCII范围(包括空格、标点)该怎么做?再进一步,查一查Unicode,看看为什么中文不能用ASCII表示,以及Python里 ord() 能处理中文会返回什么——你会发现它返回的值远大于127。这些探索会帮你建立对字符编码更立体的理解。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)