получение байтов из строки unicode в python
У меня есть 16-битная большая строка Юникода, представленная как u 'u4132',
Как я могу разделить его на целые числа 41 и 32 в python ?
6 ответов
здесь разнообразие различные пути вы можете хотеть его.
Python 2:
>>> chars = u'\u4132'.encode('utf-16be')
>>> chars
'A2'
>>> ord(chars[0])
65
>>> '%x' % ord(chars[0])
'41'
>>> hex(ord(chars[0]))
'0x41'
>>> ['%x' % ord(c) for c in chars]
['41', '32']
>>> [hex(ord(c)) for c in chars]
['0x41', '0x32']
Python 3:
>>> chars = '\u4132'.encode('utf-16be')
>>> chars
b'A2'
>>> chars = bytes('\u4132', 'utf-16be')
>>> chars # Just the same.
b'A2'
>>> chars[0]
65
>>> '%x' % chars[0]
'41'
>>> hex(chars[0])
'0x41'
>>> ['%x' % c for c in chars]
['41', '32']
>>> [hex(c) for c in chars]
['0x41', '0x32']
- Java:
"\u4132".getBytes("UTF-16BE")
- Python 2:
u'\u4132'.encode('utf-16be')
- Python 3:
'\u4132'.encode('utf-16be')
эти методы возвращают массив байтов, который можно легко преобразовать в массив int. Но обратите внимание, что код указывает выше U+FFFF
будет кодироваться с использованием двух кодовых единиц (так что с UTF-16BE это означает 32 бита или 4 байта).
" те " не являются целыми числами, это шестнадцатеричное число, которое представляет код.
Если вы хотите получить целочисленное представление кодовой точки, вы должны использовать ord(u'\u4132')
Если вы теперь хотите преобразовать это обратно в символ unicode, используйте unicode()
который вернет строку unicode.
передайте символ юникода в ord()
чтобы получить свою кодовую точку, а затем разбить эту кодовую точку на отдельные байты с помощью int.to_bytes()
а затем отформатировать вывод, как вы хотите:
list(map(lambda b: hex(b)[2:], ord('\u4132').to_bytes(4, 'big')))
возвращает: ['0', '0', '41', '32']
list(map(lambda b: hex(b)[2:], ord('\N{PILE OF POO}').to_bytes(4, 'big')))
возвращает: ['0', '1', 'f4', 'a9']
как я уже упоминал в другом комментарии, кодирование кодовой точки в utf16 не будет работать так, как ожидалось для кодовых точек за пределами BMP (базовая многоязычная плоскость), поскольку UTF16 потребуется суррогатная пара для кодирования эти кодовые точки.