CC++ & Algorithm

ASCII 编码:计算机中的字母密码本

中等8
语言版本:C++Python
概述:了解计算机如何用数字表示字母、数字和符号,就像一本“字母密码本”。

ASCII 编码:计算机里的“字母密码本”

你有没有想过,当你按下键盘上的字母“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() 还原。就像小时候玩的“电报密码”一样,有趣吧?


新手容易犯的错误

  1. 混淆字符 '0' 和数字 0
    ord('0') 得到的是 48,而不是 0。数字 0 本身是数字,没有 ASCII 码,只有字符 '0' 才有。
    ✅ 正确:ord('0') → 48
    ❌ 错误:ord(0) → 会报错(数字0不是字符)

  2. 对字符串使用 ord()
    ord() 只能处理单个字符。如果写了 ord('AB'),Python 会报错:TypeError: ord() expected a character, but string of length 2 found(要求传入一个字符,你却传了两个字符)。
    ✅ 正确:分别处理每个字符,比如 ord('A')ord('B')

  3. 忘记大小写字母编码不同
    ord('A') 是 65,ord('a') 是 97。很多新手以为大小写字母编号相同,实际上差了 32。

  4. 误以为空格和特殊符号没有编码
    空格(' ')对应 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() 就是连接这两个世界的桥梁。掌握它们,你就能在数字和字符之间自由穿梭啦!

例题精讲

1单选题

在ASCII编码中,大写字母'A'对应的十进制数值是多少?

A48
B65
C97
D32
2判断题

ASCII编码可以表示所有国家的语言文字,包括中文、日文等。

3填空题
以下Python代码想要输出字符'H'的ASCII码值(即72),请补全代码:
print(___('H'))
4单选题

已知数字字符'0'的ASCII码值为48,那么数字字符'9'的ASCII码值是多少?

A57
B56
C58
D59
5判断题

在ASCII编码中,小写字母'b'的ASCII码值比大写字母'B'的ASCII码值恰好大32。