символы Юникода в списке строк - PullRequest
0 голосов
/ 02 февраля 2019

Мне нужно разбить строку на список из отдельных символов.Но моя строка может иметь некоторые специальные символы, такие как «lã», и я хочу разбить ее, она дает мне список из трех элементов ["l", "a", "~"].Как мне получить список только с ["l", "ã"].Вот мой кодЭто так, потому что я уже попробовал несколько попыток.

fun getListOfWords (string: String) : List<String>
{
    val list = arrayListOf<String>()
    for(i in 1 .. string.length)
        list.add(string.substring(i-1, i))
    return list
}

Когда я использую его как getListOfWords ("lã").Это дает мне правильный ввод, но если у меня есть строка x = "lã" и я использую getListOfWords (x), это дает мне ["l", "a", "~"].

1 Ответ

0 голосов
/ 02 февраля 2019

Речь идет о нормализации 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 () делает то же самое.

...