В «узкой» сборке Python 2 это просто:
>>> emoticon = u'\U0001f498'
>>> map(ord,emoticon)
[55357, 56472]
Это работает в Python 2 (узкие и широкие сборки) и Python 3:
from __future__ import print_function
import struct
emoticon = u'\U0001f498'
print(struct.unpack('<2H',emoticon.encode('utf-16le')))
Вывод:
(55357, 56472)
Это более общее решение, которое печатает кодовые точки UTF-16 для любой длины строки:
from __future__ import print_function,division
import struct
def utf16words(s):
encoded = s.encode('utf-16le')
num_words = len(encoded) // 2
return struct.unpack('<{}H'.format(num_words),encoded)
emoticon = u'ABC\U0001f498'
print(utf16words(emoticon))
Вывод:
(65, 66, 67, 55357, 56472)