[英]Is there a way to find a character's Unicode code point in Python 2.7?
我正在使用我的Python程序中的国际音标(IPA)符号,这是一组相当奇怪的字符,其UTF-8代码的范围可以是1到3个字节。 几年前这个线程基本上问了相反的问题,似乎ord(character)
可以检索一个十进制数,我可以转换为十六进制,然后转换为代码点,但ord()
的输入似乎仅限于一个字节。 如果我在任何非ASCII字符上尝试ord()
,例如ɨ
,它输出:
TypeError: ord() expected a character, but a string of length 2 found
由于这不再是一个选项,Python 2.7中是否有任何方法可以找到给定字符的Unicode代码点? (那么这个角色必须是unicode
类型吗?)我不是指在Unicode表上手动查找它。
由于这不再是一个选项,Python 2.7中是否有任何方法可以找到给定字符的Unicode代码点? (那么这个角色必须是unicode类型吗?)我不是指在Unicode表上手动查找它。
您只能找到unicode对象的unicode代码点。 要将字节字符串转换为unicode对象,请使用mystr.decode(encoding)
对其进行解码,其中encoding
是字符串的编码。 (你知道你的字符串的编码,对吗?它可能是UTF-8。:-)然后你可以根据你已经找到的指令使用ord
。
>>> ord(b"ɨ".decode('utf-8'))
616
顺便说一句,从你的问题来看,听起来你正在使用UTF-8编码字节形式的字符串。 这可能会很痛苦。 您应该在获得它们后立即将字符串解码为unicode对象,并且只有在需要将它们输出到某处时才对它们进行编码。
这实际上是Python 2中的一个错误,取决于它的构建方式,对于BMP之外的unicode字符(> = 0xFFFF); 请参阅: https : //bugs.python.org/issue8670#msg105656
例如,这有效:
>>> ord('\uffff')
65535
>>> len('\uffff')
1
但这不是:
>>> ord(u'\U00010000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
更令人惊讶的是:
>>> len(u'\U00010000')
2
这是因为曾经有过“狭义”的Python构建与“宽”构建。 在“窄”构建中,unicode字符串在内部用UCS2表示(因此使用较少的内存,但必须使用两个UCS2字符(“代理对”)来表示U + FFFF以上的字符),而在“宽”构建中,UCS4是内部用于unicode字符串,你不会有这个问题。
在较新版本的Python 3中(我认为自3.2或3.3以来我不记得了)这不再是一个问题而且情况要好得多。 最简单的检查方法是使用sys.maxunicode
,它在窄版本上将是0xffff
。
这个答案演示了如何从狭义构建中的代理对中提取序数。
>>> u'ɨ'
u'\u0268'
>>> u'i'
u'i'
>>> 'ɨ'.decode('utf-8')
u'\u0268'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.