Python 2中如何将Unicode字符转换为代码点?
解决Python2中获取Unicode字符代码点的问题
这问题我之前也踩过坑,核心就是Python2和Python3的字符串模型差异搞的鬼!Python2里字符串分两种:默认的字节串(str类型)和带u前缀的Unicode字符串(unicode类型),而ord()在Python2里只能处理单个ASCII字节,或者单个Unicode码位的字符——你之前的操作没把目标字符转成正确的Unicode类型,所以才会失效。
正确的解决方案
1. 直接用Unicode字符串调用ord()
如果字符是你在代码里直接写的,一定要给字符串加u前缀声明为Unicode类型,之后直接调用ord()就能得到和Python3一样的结果:
# 先确保源文件开头加编码声明,避免字符解析报错 # -*- coding: utf-8 -*- code_point = ord(u'🎱') print(code_point) # 输出 127921
2. 从字节串转换为Unicode字符串后处理
如果你的字符是从外部(比如文件、网络请求)拿到的字节串,得先解码成Unicode字符串,再用ord():
# 假设拿到的是utf-8编码的字节串 byte_str = '🎱' # Python2里这是utf-8字节串,长度为4 unicode_str = byte_str.decode('utf-8') code_point = ord(unicode_str) print(code_point) # 输出 127921
为什么你之前的尝试无效?
'🎱'.encode('utf8'):在Python2里,'🎱'本身已经是utf-8编码的字节串(str类型),字节串只能调用decode()转成Unicode,而encode()是Unicode字符串的专属方法——直接调用会触发Python2的默认行为:先把字节串按ASCII解码,这肯定会报错。'🎱'.encode('hex'):同样的逻辑,字节串不能直接encode,而且就算强行转成hex,得到的是字节的十六进制值(比如🎱的utf-8字节hex是f09f8eb1),这和Unicode码位完全不是一回事。
额外注意事项
- 源文件开头必须加
# -*- coding: utf-8 -*-,不然Python2会用默认的ASCII编码读取文件,导致u'🎱'这类字符直接解析失败。 - 如果处理多字符的Unicode字符串,Python2的
unicode类型迭代出来的是单个码位,和Python3的str一致,遍历的时候可以逐个用ord()获取码位。
内容的提问来源于stack exchange,提问作者esfy
相关产品推荐
相关产品推荐

