数值错误:unichr()参数不在范围内(窄Python构建)

19
我想将HTML实体转换为Unicode字符,该HTML实体是󮠖。当我尝试执行以下操作时:
unichr(int(976918))

我收到了以下错误:

ValueError: unichr() arg not in range(0x10000) (narrow Python build)

看起来这是对unichar的越界转换。

3个回答

29

您可以使用"unicode-escape"编码来解码带有Unicode转义符(\U后跟8个十六进制数字,左侧补零)的字符串:

>>> s = "\\U%08x" % 976918
>>> s
'\\U000ee816'

>>> c = s.decode('unicode-escape')
>>> c
u'\U000ee816'

在窄字符编码中,它作为一个UTF-16代理对存储:

>>> list(c)
[u'\udb7a', u'\udc16']

在编码过程中,这个代理对被正确地处理为一个代码单元:

>>> c.encode('utf-8')
'\xf3\xae\xa0\x96'

>>> '\xf3\xae\xa0\x96'.decode('utf-8')
u'\U000ee816'

要将 976918 转换为 000ee816,请执行 hex(976918)[2:].zfill(8) - EoghanM

13

我使用struct模块开发了一种替代解决方案。

def unichar(i):
    try:
        return unichr(i)
    except ValueError:
        return struct.pack('i', i).decode('utf-32')

>>> unichar(int('976918'))
u'\U000ee816'

6
为了使其正常工作,您需要构建Python自身,并指定相关的选项。
./configure --enable-unicode=ucs4

在编译之前,你需要将其移植到Python 3版本。即使这样做了,似乎在Windows上仍然存在问题,但这些问题将在下一个Python版本(3.3)中得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接