pin_drop当前位置:知识文库 ❯ 图文
Python chr ord函数 - Unicode与ASCII码转换
目录
一、chr() 和 ord() 函数简介
chr() 和 ord() 是 Python 中用于字符与 Unicode 码点互相转换的一对内置函数。它们基于 Unicode 标准,支持 ASCII 字符以及全球各种语言的字符、表情符号等。
-
ord():将单个字符转换为对应的 Unicode 码点(整数)
-
chr():将 Unicode 码点(整数)转换为对应的字符
二、语法与参数说明
基本语法
代码示例
ord(character)
chr(code_point)函数参数与返回值
有效范围
三、ord() 函数使用示例
示例1:ASCII 字符
代码示例
# 英文字母
print(ord('A')) # 输出: 65
print(ord('a')) # 输出: 97
print(ord('Z')) # 输出: 90
print(ord('z')) # 输出: 122
# 数字字符
print(ord('0')) # 输出: 48
print(ord('9')) # 输出: 57
# 特殊字符
print(ord('!')) # 输出: 33
print(ord(' ')) # 输出: 32(空格)示例2:中文字符
代码示例
# 常用汉字(基本多文种平面)
print(ord('中')) # 输出: 20013
print(ord('文')) # 输出: 25991
print(ord('你')) # 输出: 20320
print(ord('好')) # 输出: 22909
# 十六进制表示
print(f"中: U+{ord('中'):04X}") # 输出: 中: U+4E2D
print(f"文: U+{ord('文'):04X}") # 输出: 文: U+6587示例3:表情符号
代码示例
# Emoji 表情(使用 Unicode 转义避免编码问题)
print(ord('\U0001F600')) # 输出: 128512 (笑脸)
print(ord('❤')) # 输出: 10084
print(ord('\U0001F389')) # 输出: 127881 (彩带)
print(f"码点 128512 对应字符: {chr(128512)}")四、chr() 函数使用示例
示例1:基础用法
代码示例
# ASCII 范围
print(chr(65)) # 输出: A
print(chr(97)) # 输出: a
print(chr(48)) # 输出: 0
print(chr(33)) # 输出: !
# 十六进制写法(更直观)
print(chr(0x41)) # 输出: A
print(chr(0x61)) # 输出: a示例2:生成中文字符
代码示例
# 从 Unicode 码点生成中文
print(chr(20013)) # 输出: 中
print(chr(25991)) # 输出: 文
# 使用十六进制
print(chr(0x4E2D)) # 输出: 中
print(chr(0x6587)) # 输出: 文示例3:生成表情符号
代码示例
# 生成 Emoji(使用十六进制码点)
print(chr(0x1F600)) # 输出: 笑脸表情
print(chr(0x2764)) # 输出: 红心
print(chr(0x1F389)) # 输出: 庆祝彩带
# 生成特殊符号
print(chr(0x00A9)) # 输出: ©(版权符号)
print(chr(0x2603)) # 输出: 雪人符号
print(chr(0x2665)) # 输出: 心形符号五、chr() 与 ord() 互逆关系
chr() 和 ord() 是互逆函数,即 chr(ord(x)) == x 和 ord(chr(n)) == n。
代码示例
# 验证互逆关系
char = 'A'
code = ord(char)
back_to_char = chr(code)
print(f"原始字符: {char}")
print(f"ord 转换: {code}")
print(f"chr 还原: {back_to_char}")
print(f"是否相等: {char == back_to_char}") # 输出: True
# 反向验证
num = 20013
char_from_num = chr(num)
back_to_num = ord(char_from_num)
print(f"原始码点: {num}")
print(f"chr 转换: {char_from_num}")
print(f"ord 还原: {back_to_num}")
print(f"是否相等: {num == back_to_num}") # 输出: True六、ASCII 码常用对照表
七、Unicode 与 ASCII 对比
八、实际应用场景
场景1:凯撒密码加密解密
代码示例
def caesar_cipher(text, shift):
"""凯撒密码:每个字母向后移动 shift 位"""
result = []
for char in text:
if 'a' <= char <= 'z':
# 小写字母循环移位
shifted = (ord(char) - ord('a') + shift) % 26 + ord('a')
result.append(chr(shifted))
elif 'A' <= char <= 'Z':
# 大写字母循环移位
shifted = (ord(char) - ord('A') + shift) % 26 + ord('A')
result.append(chr(shifted))
else:
# 非字母保持不变
result.append(char)
return ''.join(result)
# 加密
original = "Hello World!"
encrypted = caesar_cipher(original, 3)
print(f"原文: {original}") # 输出: Hello World!
print(f"加密: {encrypted}") # 输出: Khoor Zruog!
# 解密
decrypted = caesar_cipher(encrypted, -3)
print(f"解密: {decrypted}") # 输出: Hello World!场景2:字符串排序依据
代码示例
# 查看字符串的码点序列
def show_code_points(text):
return [ord(c) for c in text]
print(show_code_points("Hello")) # 输出: [72, 101, 108, 108, 111]
print(show_code_points("中文")) # 输出: [20013, 25991]
# 解释为什么大写字母排在小写字母前面
print(f"A 的码点: {ord('A')}") # 65
print(f"a 的码点: {ord('a')}") # 97
print('A' < 'a') # True场景3:生成字母表
代码示例
# 生成大写和小写字母表
uppercase = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
lowercase = [chr(i) for i in range(ord('a'), ord('z') + 1)]
digits = [chr(i) for i in range(ord('0'), ord('9') + 1)]
print(f"大写字母: {''.join(uppercase)}")
# 输出: ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(f"小写字母: {''.join(lowercase)}")
# 输出: abcdefghijklmnopqrstuvwxyz
print(f"数字: {''.join(digits)}")
# 输出: 0123456789场景4:字符分类判断
代码示例
def classify_char(char):
"""判断字符类型"""
code = ord(char)
if 0x0041 <= code <= 0x005A:
return "大写字母"
elif 0x0061 <= code <= 0x007A:
return "小写字母"
elif 0x0030 <= code <= 0x0039:
return "数字"
elif 0x4E00 <= code <= 0x9FFF:
return "汉字"
else:
return "其他字符"
print(classify_char('A')) # 输出: 大写字母
print(classify_char('中')) # 输出: 汉字
print(classify_char('5')) # 输出: 数字
print(classify_char('@')) # 输出: 其他字符九、注意事项
注意1:
ord()只能接收长度为 1 的字符串,传入多个字符会抛出TypeError。
代码示例
# 错误示例
ord("AB") # TypeError: ord() expected a character, but string of length 2 found
# 正确做法:逐个字符处理
[ord(c) for c in "AB"] # 输出: [65, 66]注意2:
chr()的参数必须在有效 Unicode 范围内(0 到 0x10FFFF),超出会抛出ValueError。
代码示例
# 错误示例
chr(0x110000) # ValueError: chr() arg not in range(0x110000)
chr(-1) # ValueError: chr() arg not in range(0x110000)注意3:ASCII 码中大小写字母相差 32,这个特性可用于大小写转换而不使用
upper()/lower()。
代码示例
# 大写转小写(加 32)
print(chr(ord('A') + 32)) # 输出: a
# 小写转大写(减 32)
print(chr(ord('a') - 32)) # 输出: A注意4:某些 Emoji 表情由多个码点组成(如组合表情符号),
ord()只能处理单个码点字符。
代码示例
# 简单表情(单码点)
print(ord('\U0001F600')) # 正常: 128512(笑脸表情)
# 组合表情(多码点)- 需要特殊处理
# 例如"男程序员"表情由 3 个码点组成:男人 + ZWJ + 电脑
# 使用 Unicode 转义表示
man = '\U0001F468' # 男人
laptop = '\U0001F4BB' # 电脑
print([hex(ord(c)) for c in man + laptop])
# 输出: ['0x1f468', '0x1f4bb']十、小贴士
小贴士
Unicode 转义写法:在 Python 字符串中,可以直接使用 Unicode 转义序列 \uXXXX(4 位十六进制)或 \UXXXXXXXX(8 位十六进制)表示字符。例如 "\u4E2D" 等价于 chr(0x4E2D),即字符"中"。
十一、常见问题
常见问题
Q1: ord() 和 ASCII 码有什么区别?
ASCII 是 Unicode 的子集。对于 ASCII 字符(0-127),ord() 返回的值与 ASCII 码相同。对于非 ASCII 字符(如中文、Emoji),ord() 返回 Unicode 码点。
Q2: 如何获取字符串中所有字符的码点?
使用列表推导式:[ord(c) for c in text]。也可以使用 map(ord, text)。
Q3: chr() 能否生成不可见字符?
可以。例如 chr(0) 是 NUL(空字符),chr(10) 是换行符,chr(27) 是 ESC 字符。这些字符在屏幕上不可见但有特殊用途。
Q4: 如何判断一个字符是否为汉字?
可以通过码点范围判断:0x4E00 <= ord(char) <= 0x9FFF 是最常用的汉字范围(CJK 基本区块)。更完整的判断还需考虑扩展区块。
十二、练习题
练习1
编写一个函数 simple_hash(text),将字符串中每个字符的 Unicode 码点相加,返回一个整数哈希值。例如 simple_hash("ABC") 返回 198(65+66+67)。
练习2
编写一个函数 count_char_types(text),统计字符串中大写字母、小写字母、数字、汉字和其他字符的数量,返回一个字典。使用 ord() 进行范围判断。
本文涉及AI创作
内容由AI创作,请仔细甄别