Проблема заключается в том, что первый ë отсчитывается дважды, или я думаю, что ë находится в положении 0 и 'находится в позиции 1.
blockquote>Да. Вот как код указывает на Unicode. В общем, вы можете попросить Python преобразовать букву и отдельную «комбинирующую» диакритическую метку, такую как U + 0301 COMBINING ACUTE ACCENT, используя нормализацию Unicode:
>>> unicodedata.normalize('NFC', u'a\u0301') u'\xe1' # single character: á
Однако в Unicode нет единого символа для «С диарезисом и острым акцентом», потому что ни один язык в мире никогда не использовал букву «ë». (Транслитерация пиньинь имеет «u с диарезисом и острым акцентом», но не «e».) Следовательно, поддержка шрифтов оставляет желать лучшего; во многих случаях это очень плохо отражается и является беспорядочным блобом в моем веб-браузере.
Чтобы определить, где «редактируемые точки» в строке кодовых точек Юникода - это сложная работа, требующая довольно многого о доменном знании языков. Это часть вопроса о «сложном текстовом макете», области, которая также включает в себя такие вопросы, как двунаправленный текст и контекстуальное шейпинг и лигатуры. Для выполнения сложного текстового макета вам понадобится библиотека, такая как Uniscribe в Windows или Pango вообще (для которой есть интерфейс Python).
Если, с другой стороны, вы просто хотите полностью игнорировать все сочетая символы при выполнении подсчета, вы можете легко избавиться от них:
def withoutcombining(s): return ''.join(c for c in s if unicodedata.combining(c)==0) >>> withoutcombining(u'ë́aúlt') '\xeba\xfalt' # ëaúlt >>> len(_) 5