получение байтов из строки Unicode в Python - PullRequest
8 голосов
/ 21 ноября 2010

У меня есть 16-битная строка с байтовым порядком байтов в порядке байтов, представленная как u '\ u4132',

как я могу разделить его на целые числа 41 и 32 в python?

Ответы [ 6 ]

15 голосов
/ 22 ноября 2010

Вот множество способов, которыми вы можете захотеть.

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']
4 голосов
/ 21 ноября 2010
  • 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 байта).

2 голосов
/ 22 ноября 2010
>>> c = u'\u4132'
>>> '%x' % ord(c)
'4132'
2 голосов
/ 21 ноября 2010

«Те» не являются целыми числами, это шестнадцатеричное число, которое представляет кодовую точку .

Если вы хотите получить целочисленное представление кодовой точки, которую вам нужно использовать ord(u'\u4132'), если вы теперь хотите преобразовать это обратно в символ Unicode, используйте unicode(), который вернет строку Unicode.

1 голос
/ 21 ноября 2010

Грязный хак: repr(u'\u4132') вернется "u'\\u4132'"

0 голосов
/ 02 июля 2018

Передайте символ 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 потребуется суррогатная пара для кодирования этих кодовых точек.

...