Речь идет о нормализации Unicode.
Unicode достаточно гибок и имеет несколько способов кодирования некоторых символов.В частности, 'ã' может быть закодирован как один символ (U + 00E3, МАЛЕНЬКОЕ ПИСЬМО A ЛАТИНЫ С TILDE) или как два (U + 0061, МАЛЕНЬКОЕ ПИСЬМО А ЛАТИНЫ A, за которым следует U + 0303, TILDE КОМБИНИРОВАНИЯ).Первая - это более стандартная, «нормализованная» форма, но обе будут выглядеть одинаково при распечатке.Однако Котлин видит их по-разному, как вы обнаружили.
Какой из них вы начнете, будет зависеть от того, откуда взялась строка.(Например, в текстовом редакторе, который вы использовали для сохранения исходного кода, в котором он указан, или текстового файла, из которого вы его загружаете.)
Хорошая новость заключается в том, что с какой бы формы вы ни начинали, вы можете преобразоватьв нужную форму, используя java.text.Normalizer
:
val normalizedString = Normalizer.normalize(string, Normalizer.Form.NFC)
Затем вы можете разделить результат (или выполнить любую другую обработку, какую захотите).
В качестве альтернативы, если вы предпочитаете декомпозироватьвместо этого вы можете использовать Normalizer.Form.NFD
.(Для получения дополнительной информации см. Руководство Oracle . Вы также можете использовать нормализатор для выполнения другой обработки, такой как удаление диакритических знаков .)
Кстати, это означает, что ничего нетнеправильно с вашей getListOfWords()
функцией.Ну, кроме названия, так как на самом деле это не разделение слов - но я думаю, это работа в процессе!Если вы действительно хотите разделить символы, встроенная функция String.toList () делает то же самое.