有没有办法在Python 2.7中找到角色的Unicode代码点?

时间:2016-08-12 03:20:23

标签: python python-2.7 unicode

我在我的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表上手动查找它。

3 个答案:

答案 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'