«Узкая» сборка Python 2 использует UTF-16 для хранения строк Unicode (так называемая негерметичная абстракция , поэтому кодовые точки> U + FFFF - это два суррогата UTF. Чтобы извлечь кодовую точку, Вы должны получить как ведущий, так и конечный суррогат:
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = u'Python is fun \U0001f44d'
>>> s[-1] # Just the trailing surrogate
u'\udc4d'
>>> s[-2:] # leading and trailing
u'\U0001f44d'
Переключитесь на Python 3.3+, где проблема была решена и детали хранения кодовых точек Unicode в строке Unicode не отображаются:
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = u'Python is fun \U0001f44d'
>>> s[-1] # code points are stored in Unicode strings.
'\U0001f44d'