Специальная интерпретация UTF-8: Я предполагаю, что у вас есть точка Unicode, представленная в шестнадцатеричном формате в UTF-8, хранящаяся в виде строки в переменной (c).И вы хотите определить соответствующий символ.Затем следующий фрагмент кода показывает, как это сделать:
>>> import binascii
>>> cp2chr = lambda c: binascii.unhexlify(c.zfill(len(c) + (len(c) & 1))).decode('utf-8')
>>> cp2chr('C484')
'Ą'
Объяснение: zfill
добавляет ноль, если число символов нечетное.binascii.unhexlify
в основном принимает два символа каждый, интерпретирует их как шестнадцатеричные числа и делает их одним байтом.Все эти байты объединяются в массив байтов.Наконец, str.decode('utf-8')
интерпретирует эти байты как данные в кодировке UTF-8 и возвращает их как строку.
>>> cp2chr('00C4')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 1: unexpected end of data
Однако приведенный вами пример не является действительными данными UTF-8.См. Таблица структуры байтов UTF-8 в Википедии , чтобы определить действительные последовательности байтов.C4
имеет битовую структуру 11000100
, поэтому является байтом продолжения и впоследствии требует другого символа.
Кодирование независимой интерпретации: Таким образом, вы можете искать интерпретацию точек Unicode независимо откодирование.Затем вы ищете кодировку raw_unicode_escape
:
>>> cp2chr = lambda c: (b'\\u' + c.encode('ascii')).decode('raw_unicode_escape')
>>> cp2chr('00C4')
'Ä'
Объяснение: raw_unicode_escape
преобразует escape-последовательности Юникода, заданные в байтовой строке, и возвращает ее в виде строки: b'\\u00C4'.decode('raw_unicode_escape')
дает Ä
.Это то, что Python делает внутренне, если вы пишете \uSOMETHING
в своем исходном коде.