ValueError:unichr()arg不在范围内(0x10000)(窄Python构建)

Aam*_*nan 19 html python

我试图将html实体转换为unichar,html实体是󮠖 当我尝试执行以下操作时:

unichr(int(976918))
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ValueError: unichr() arg not in range(0x10000) (narrow Python build)
Run Code Online (Sandbox Code Playgroud)

似乎它超出了unichar的范围转换.

Ery*_*Sun 29

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

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

>>> c = s.decode('unicode-escape')
>>> c
u'\U000ee816'
Run Code Online (Sandbox Code Playgroud)

在狭窄的构建中,它存储为UTF-16代理对:

>>> list(c)
[u'\udb7a', u'\udc16']
Run Code Online (Sandbox Code Playgroud)

在编码期间,此代理项对作为代码单元正确处理:

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

>>> '\xf3\xae\xa0\x96'.decode('utf-8')
u'\U000ee816'
Run Code Online (Sandbox Code Playgroud)


Mar*_*som 11

这是我用struct模块开发的替代解决方法.

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

>>> unichar(int('976918'))
u'\U000ee816'
Run Code Online (Sandbox Code Playgroud)


agf*_*agf 6

为了实现这一点,您需要自己构建Python,并指定

./configure --enable-unicode=ucs4
Run Code Online (Sandbox Code Playgroud)

在编译之前,或者你需要转到Python 3.

即使你这样做,Windows上也存在明显的问题,将在下一版本的Python(3.3)中修复.