ValueError: unichr() 参数超出范围(0x10000)(窄版Python构建)

19 投票
3 回答
10828 浏览
提问于 2025-04-16 23:51

我正在尝试把一个HTML实体转换成unichar,这个HTML实体是 󮠖。当我尝试这样做的时候:

unichr(int(976918))

我遇到了一个错误:

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

看起来这个转换超出了unichar的范围。

3 个回答

6

为了让这个功能正常工作,你要么需要自己编译Python,并在编译之前指定

./configure --enable-unicode=ucs4

要么就得升级到Python 3。

即使你这样做了,Windows上似乎还是会有一些问题,不过这些问题会在下一个版本的Python(3.3)中修复。

13

这是我用 struct 模块开发的一个替代解决方案。

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

>>> unichar(int('976918'))
u'\U000ee816'
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'

撰写回答