Python: конвертировать шестнадцатеричные строки Unicode в Unicode - PullRequest
5 голосов
/ 21 июля 2011

У меня есть шестнадцатеричная строка, созданная из строки Unicode с этой функцией:

def toHex(s):
    res = ""
    for c in s:
        res += "%02X" % ord(c) #at least 2 hex digits, can be more
    return res

hex_str = toHex(u"...")

Возвращает строку, подобную этой:

"80547CFB4EBA5DF15B585728"

Это последовательность из 6 китайских символов.
Но

u"Knödel"

конвертируется в

"4B6EF664656C"

Теперь мне нужна функция, чтобы преобразовать это обратно в исходный юникод. Кажется, что китайские символы имеют 2-байтовое представление, в то время как второй пример имеет 1-байтовые представления для всех символов. Поэтому я не могу просто использовать unichr () для каждого 1- или 2-байтового блока.

Я уже пробовал

binascii.unhexlify(hex_str)

но это, кажется, конвертирует побайтово и возвращает строку, а не юникод. Я также попробовал

binascii.unhexlify(hex_str).decode(...)

с разными форматами. Никогда не получал исходную строку Unicode.

Заранее большое спасибо!

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Это, кажется, работает просто отлично:

binascii.unhexlify(binascii.hexlify(u"Knödel".encode('utf-8'))).decode('utf-8')

Возвращается к исходному объекту. Вы можете сделать то же самое для китайского текста, если он закодирован правильно, однако ord(x) уже уничтожает текст, с которого вы начали. Сначала вам нужно будет его закодировать, а затем обрабатывать как строку байтов.

1 голос
/ 21 июля 2011

Не может быть сделано. Использование %02X теряет слишком много информации. Сначала вы должны использовать что-то вроде UTF-8 и преобразовать его, вместо того, чтобы придумывать неработающую кодировку.

>>> u"Knödel".encode('utf-8').encode('hex')
'4b6ec3b664656c'
0 голосов
/ 10 февраля 2012

Когда я некоторое время назад работал с Unicode в приложении VB, первые 1 или 2 цифры были бы удалены, если бы они были "0".Значение «& H00A2» будет автоматически преобразовано в «& HA2», я просто создал небольшую функцию для проверки длины строки и, если она была меньше 4 символов, добавьте недостающие нули.Я не уверен, что это с тобой происходит, но я подумал, что дам немного информации, чтобы знать о ней.

...