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).