ASCII 编码:计算机中的字母密码本
中等8ASCII 编码:计算机里的“字母密码本”
你有没有想过,当你按下键盘上的字母“A”时,计算机是怎么知道是“A”的呢?计算机其实只懂0和1,所以我们需要一套规则,把字母翻译成数字。这个规则就是 ASCII 编码(读作“阿斯克”)。
这一篇我们就来深入认识这本“密码本”,看看数字和字符是如何一一对应的,以及如何在 Python 中轻松“翻译”它们。
什么是 ASCII 编码?
ASCII 的全称是 American Standard Code for Information Interchange(美国信息交换标准代码)。它就像一个统一的“密码本”,规定了 128个 常用字符(包括英文字母、数字、标点符号和一些控制字符)对应的数字(0到127)。每个字符都有一个固定的数字代号,全世界所有计算机都遵守这个约定。
想象一下,你和好朋友约定了一本“暗号本”:你想说“你好”,就写数字 1;想说“再见”,就写数字 2。ASCII 就是计算机界的“暗号本”。比如:
- 大写字母
A对应数字 65 - 大写字母
B对应数字 66 - 小写字母
a对应数字 97 - 数字字符
'0'对应数字 48(注意:是字符 '0',不是数字 0!) - 空格
' '对应数字 32 - 感叹号
'!'对应数字 33
重要规律: 字母是连续排列的。大写字母 AZ 对应 6590,小写字母 az 对应 97122,数字字符 '0''9' 对应 4857。大小写字母相差 32,比如 'A'(65) + 32 = 'a'(97)。
用 Python 扮演“翻译官”
Python 提供了两个内置函数,就像一对“翻译机器人”:
ord(字符):把单个字符“翻译”成它对应的 ASCII 数字。chr(数字):把 ASCII 数字“翻译”成对应的字符。
试试下面的“解密”游戏:
# ord() 将字符转换为 ASCII 码
print(ord('A')) # 输出 65
print(ord('a')) # 输出 97
print(ord('0')) # 输出 48(注意:这是字符'0',不是数字0)
print(ord(' ')) # 输出 32(空格也有自己的编号)
# chr() 将 ASCII 码转换为字符
print(chr(65)) # 输出 A
print(chr(97)) # 输出 a
print(chr(48)) # 输出 0
print(chr(32)) # 输出 (一个空格,看不见但确实存在)
你也可以把这两个函数用起来,做一个“字母密码本”小程序:
# 让用户输入一个字符,显示它的 ASCII 码
user_char = input("请输入一个英文字母或符号:") # 用户输入字符
ascii_code = ord(user_char) # 获取对应的ASCII码
print(f"字符 '{user_char}' 的ASCII码是 {ascii_code}")
运行试一下:输入 A,输出结果是 字符 'A' 的ASCII码是 65。
小技巧:一键打印所有大写字母
利用 ASCII 码是连续的,我们可以用 for 循环轻松打印出某个范围的字符。比如想看看大写字母 A 到 Z 长什么样子:
# 从65(A)循环到90(Z)
for i in range(65, 91):
print(chr(i), end=' ') # 输出 A B C ... Z
甚至可以用一句列表推导式把它们装进一个列表:
# 把大写字母放在列表中
uppercase_letters = [chr(code) for code in range(65, 91)]
print(uppercase_letters) # 输出 ['A','B','C',...,'Z']
这样写代码的好处是:以后想生成小写字母,只需要把范围改成 97~123 即可。
生活中的例子:用 ASCII 码藏暗号
想象你给朋友写了一张小纸条,上面全是数字:72 69 76 76 79。朋友知道这是 ASCII 码,就可以用 chr() 翻译成字母:H E L L O —— 原来是一句英文“HELLO”。
反过来,你也可以用 ord() 把一句话变成数字,再传给朋友,朋友再用 chr() 还原。就像小时候玩的“电报密码”一样,有趣吧?
新手容易犯的错误
-
混淆字符 '0' 和数字 0
ord('0')得到的是 48,而不是 0。数字 0 本身是数字,没有 ASCII 码,只有字符 '0' 才有。
✅ 正确:ord('0')→ 48
❌ 错误:ord(0)→ 会报错(数字0不是字符) -
对字符串使用 ord()
ord()只能处理单个字符。如果写了ord('AB'),Python 会报错:TypeError: ord() expected a character, but string of length 2 found(要求传入一个字符,你却传了两个字符)。
✅ 正确:分别处理每个字符,比如ord('A')、ord('B') -
忘记大小写字母编码不同
ord('A')是 65,ord('a')是 97。很多新手以为大小写字母编号相同,实际上差了 32。 -
误以为空格和特殊符号没有编码
空格(' ')对应 32,感叹号('!')对应 33,换行符('\n')对应 10。所有常见符号都有 ASCII 码。
完整示例:制作一个“加密与解密”小工具
下面的程序可以让用户选择加密(把字符变成数字)或解密(把数字变成字符),相当于一个迷你“ASCII 密码本”:
"""
ASCII 加密解密小工具
加密:输入字符串,输出每个字符的 ASCII 码(用空格隔开)
解密:输入一串数字(用空格隔开),还原成字符串
"""
print("=== ASCII 密码本工具 ===")
choice = input("请选择:1-加密(字符→数字) 2-解密(数字→字符):") # 用户选择功能
if choice == '1':
# 加密模式
original = input("请输入要加密的英文字母或符号:") # 原字符串
encrypted_list = [] # 用来存每个字符的ASCII码
for ch in original: # 遍历每个字符
code = ord(ch) # 获取ASCII码
encrypted_list.append(str(code)) # 转换成字符串并加入列表
result = ' '.join(encrypted_list) # 用空格连接成字符串
print(f"加密结果:{result}")
elif choice == '2':
# 解密模式
codes_str = input("请输入ASCII码(用空格隔开):") # 例如 "65 66 67"
code_strings = codes_str.split() # 按空格分割成列表
decrypted_list = [] # 用来存解密后的字符
for s in code_strings: # 遍历每个数字字符串
code = int(s) # 转换为整数
ch = chr(code) # 转换为字符
decrypted_list.append(ch)
result = ''.join(decrypted_list) # 合并成字符串
print(f"解密结果:{result}")
else:
print("无效选择,请输入1或2")
运行示例:
=== ASCII 密码本工具 ===
请选择:1-加密(字符→数字) 2-解密(数字→字符):1
请输入要加密的英文字母或符号:Hello
加密结果:72 101 108 108 111
请选择:1-加密(字符→数字) 2-解密(数字→字符):2
请输入ASCII码(用空格隔开):72 101 108 108 111
解密结果:Hello
这个例子综合运用了 ord()、chr()、字符串分割和列表操作,很适合作为练习。
相关指引
- ASCII 与 Unicode:ASCII 只能表示 128 个字符,而 Unicode(如 UTF-8)可以表示全球几乎所有文字(中文、日文、emoji 等),并且 ASCII 的部分在 Unicode 中完全兼容。你会常说“字符的 Unicode 码点”,其实和 ASCII 码是一回事(对英文字符而言)。
- 字符串处理:学会字符与数字转换后,可以尝试写一个“字母大小写转换器”(利用大小写相差 32 的规律)。
- 简单加密:凯撒密码把每个字母的 ASCII 码加一个固定数,再用
chr()变回去,就能做出你自己的加密游戏。
记住: 每个字符背后都藏着一个固定的数字,而 ord() 和 chr() 就是连接这两个世界的桥梁。掌握它们,你就能在数字和字符之间自由穿梭啦!
例题精讲
在ASCII编码中,大写字母'A'对应的十进制数值是多少?
ASCII编码可以表示所有国家的语言文字,包括中文、日文等。
以下Python代码想要输出字符'H'的ASCII码值(即72),请补全代码:
print(___('H'))已知数字字符'0'的ASCII码值为48,那么数字字符'9'的ASCII码值是多少?
在ASCII编码中,小写字母'b'的ASCII码值比大写字母'B'的ASCII码值恰好大32。