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() 单个字符 str(长度为1) int(Unicode 码点)
chr() 码点值 int str(对应字符)

有效范围

函数 最小值 最大值 范围说明
chr() 0 1,114,111 (0x10FFFF) Unicode 全部码点
ord() 0 (NUL) 1,114,111 同上

三、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)) == xord(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 码常用对照表

字符类型 字符 十进制 十六进制
换行符 \n 10 0x0A
空格 32 0x20
数字 0 0 48 0x30
数字 9 9 57 0x39
大写字母 A A 65 0x41
大写字母 Z Z 90 0x5A
小写字母 a a 97 0x61
小写字母 z z 122 0x7A

七、Unicode 与 ASCII 对比

对比项 ASCII Unicode
码点范围 0-127 0-1,114,111
字符数量 128 个 超过 14 万个
支持语言 仅英文 全球所有语言
字节大小 7 位(1 字节) 可变(UTF-8 为 1-4 字节)
关系 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('@'))   # 输出: 其他字符

九、注意事项

注意1ord() 只能接收长度为 1 的字符串,传入多个字符会抛出 TypeError

代码示例

# 错误示例
ord("AB")  # TypeError: ord() expected a character, but string of length 2 found

# 正确做法:逐个字符处理
[ord(c) for c in "AB"]  # 输出: [65, 66]

注意2chr() 的参数必须在有效 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() 进行范围判断。

标签: chr函数 ord函数 Unicode ASCII码 内置函数 字符编码

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python bool()函数 下一篇: Python内置函数dir()

poll相关推荐