ValueError: unichr() arg не в диапазоне (0x10000) (узкая сборка Python)
Я пытаюсь преобразовать объект html в unichar, объект html 󮠖
когда я пытаюсь сделать следующее:
unichr(int(976918))
У меня возникла ошибка:
ValueError: unichr() arg not in range(0x10000) (narrow Python build)
похоже, что это вне диапазона преобразования для unichar.
Ответы
Ответ 1
Вы можете декодировать строку, которая имеет escape-код Unicode (\U
, за которым следуют 8 шестнадцатеричных цифр с нулевой добавкой) с использованием кодировки "unicode-escape"
:
>>> 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'
Ответ 2
Здесь приведено альтернативное обходное решение, которое я разработал с помощью модуля struct
.
def unichar(i):
try:
return unichr(i)
except ValueError:
return struct.pack('i', i).decode('utf-32')
>>> unichar(int('976918'))
u'\U000ee816'
Ответ 3
Чтобы это сработало, вам нужно либо самостоятельно создать Python, указав
./configure --enable-unicode=ucs4
перед компиляцией, иначе вам нужно перейти на Python 3.
Даже если вы это сделаете, в Windows существуют проблемы, которые будут исправлены в следующей версии Python (3.3).