ValueError: unichr() 参数超出范围(0x10000)(窄版Python构建)
我正在尝试把一个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'