我在我的Python程序中使用国际音标(IPA)符号,这是一组相当奇怪的字符,其UTF-8代码的范围可以是1到3个字节长。几年前This thread基本上问了相反的问题,似乎ord(character)
可以检索一个十进制数,我可以将其转换为十六进制数,然后转换为代码点,但是ord()
的输入似乎只限于一个字节。如果我在任何非ASCII字符上尝试ord()
,例如ɨ
,则输出:
TypeError: ord() expected a character, but a string of length 2 found
由于这不再是一个选项,Python 2.7中是否有任何方法可以找到给定字符的Unicode代码点? (然后这个角色必须是unicode
类型吗?)我不是指在Unicode表上手动查找它。
答案 0 :(得分:4)
由于这不再是一个选项,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对象,并且只有在需要将它们输出到某处时才对其进行编码。
答案 1 :(得分:2)
这实际上是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
,在{mm}上为0xffff
。
This answer演示了如何从窄版本中的代理对中提取序数。
答案 2 :(得分:1)
>>> u'ɨ'
u'\u0268'
>>> u'i'
u'i'
>>> 'ɨ'.decode('utf-8')
u'\u0268'