Python中ord()处理非ASCII字符报错,如何获取Latin-1字符十进制值?
获取Latin-1字符的十进制值(如é的233)
这个问题的核心在于Python中字符串的Unicode编码特性,以及ord()函数的输入要求,让我一步步拆解解决方法:
为什么ord('é')会报错?
你遇到的TypeError说明你输入的'é'其实是两个Unicode字符的组合体——也就是分解形式:基础字符'e'(U+0065)加上组合重音符号'́'(U+0301)。这种情况下字符串长度为2,而ord()只接受单个Unicode字符,自然会抛出错误。
解决方法
1. 先归一化字符到预组合形式
如果你的字符是分解形式,先用unicodedata.normalize()转换成预组合的单个字符,再调用ord():
import unicodedata # 处理分解形式的é(实际是两个字符的组合) decomposed_e = 'é' normalized_e = unicodedata.normalize('NFC', decomposed_e) print(len(normalized_e)) # 输出1,确认是单个字符 print(ord(normalized_e)) # 输出233,完全匹配Latin-1的数值
2. 直接编码为Latin-1字节再转整数
Latin-1(ISO-8859-1)的每个字符对应一个字节,所以可以将预组合的字符编码为Latin-1字节串,再对字节调用ord():
# 假设已拿到预组合的é print(ord('é'.encode('latin-1'))) # 输出233
3. 直接调用ord()(适用于预组合字符)
如果你的字符是预组合的é(Unicode码点U+00E9),它的码点值正好等于Latin-1对应的十进制值,直接用ord()即可:
print(ord('é')) # 输出233,前提是该字符为单个预组合字符
关键知识点
- Latin-1(ISO-8859-1)覆盖了Unicode的U+0000到U+00FF范围,这个区间内的预组合Unicode字符,
ord()返回的值就是Latin-1对应的十进制值。 - Unicode对带重音的字符有两种表示方式:预组合(单个码点)和分解(基础字符+组合符号),处理前做归一化可以避免长度问题。
内容的提问来源于stack exchange,提问作者e___e
相关产品推荐
相关产品推荐

