Проблема не в языке Python -
Дело в том, что конкретный символ, на который вы указываете, и, возможно, другие, имеют два сочетания диакритических знаков. И проблема в том, что не все текстовые приложения могут справиться с этим. Я сам использую основанный на Qt терминал, где вставка первой строки в вашем вопросе просто «устраняет» второй диакритический знак - «` », оставляя только« ô ». (Однако терминал на основе GTK + обрабатывает его правильно).
Так что дело в том, что строка в Юникоде, представленная Python, верна. Терминальное приложение, которое вы используете, чтобы увидеть, что оно не может правильно его обработать, и помещает два диакритических знака в один и тот же символ.
Отфильтровывать диакритические знаки от символов Юникода почти никогда не бывает «правильным решением». Если ваше приложение поддерживает вьетнамский текст, оно должно делать это правильно, а не конвертировать некоторые символы в режиме без вывода сообщений.
Для языков "западного базирования", где буквы обычно имеют один диакритический знак, что гораздо проще - не только отлично работают терминальная и выходная библиотеки, но также, как правило, все символы представлены одной кодовой точкой Unicode.
Однако, когда вам нужно больше диакритических знаков на символ, вы теряете эквивалентность «один символ в строке» равняется «одному символу на экране» (независимо от правильности вывода). И тогда вам придется беспокоиться об этом в своем коде.
Если вы просто индексируете что-то для поиска и даже текстовый корпус для обучения, может быть, все в порядке, чтобы убрать диакритические знаки, но тогда, возможно, вам следует удалить их все.
Способ сделать это состоит в том, чтобы принудительно ввести строку в нормализованное представление Unicode, в котором все диакритические знаки представлены в виде отдельных «объединяющих символов» вместо составных символов, а затем отфильтровываются только буквенные символы;
import unicodedata
a = "vui lòng cởi đồ ra tôi muốn nghe khám bệnh"
# Normalize the internal representation:
b = unicodedata.normalize("NFKD", a)
print(*(c for c in b), sep=" ")
# outputs: "v u i l o ̀ n g c o ̛ ̉ i đ o ̂ ̀ r a t o ̂ i m u o ̂ ́ n n g h e k h a ́ m b e ̣ ̂ n h"
# recreates the string filtering out combining characters:
c = "".join(c for c in b if unicodedata.category(c) != "Mn")
print(c)
# outputs: 'vui long coi đo ra toi muon nghe kham benh'