Как отметили в комментариях , ваш текст верный, он просто отображается неправильно (ваша консоль, какой бы она ни была, не дружественна Юникоду и не обрабатывает символы, объединяющие Юникод должным образом).
Ваша настоящая проблема в том, что вы пытаетесь выполнить некоторую обработку для удаления знаков препинания, а объединяющие диакритические знаки рассматриваются как знаки пунктуации и удаляются .
В вашем случае задействовано несколько объединяющих диакритических знаков, и не существует единственного порядкового номера Unicode, который представляет все их вместе взятые, поэтому использование unicodedata.normalize('NFC', originalstring)
вам не поможет (это объединит один из символов объединения для ọ́
, но не оба).
Таким образом, ваше единственное реальное решение состоит в том, чтобы исправить фильтр пунктуации, чтобы он не пропадал при комбинировании символов.Это не должно быть слишком сложно, просто измените код фильтрации с:
if is_punctuation(letter): # is_punctuation is whatever test you're using to find punctuation
# drop letter
else:
# keep letter
на (после добавления import unicodedata
в начало вашего файла):
if is_punctuation(letter) and not unicodedata.combining(letter):
# drop letter
else:
# keep letter
unicodedata.combining
возвращает 0
для комбинированных символов, не 0
в противном случае , так что вы можете использовать его, чтобы гарантировать, что комбинированные символы не будут удалены, даже если они считаются пунктуацией по какому-либо другому стандарту.