繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM