字符串列表中的unicode字符

时间:2019-02-02 05:22:51

标签: string list unicode kotlin char

我需要将字符串分成单个字符列表。但是我的字符串可以有一些特殊字符,例如“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 =“LA”和使用getListOfWords(x)的它给我[“升”,“一”,“〜”。

1 个答案:

答案 0 :(得分:1)

这与Unicode规范化有关。

Unicode是相当灵活,并且具有多种方式来编码某些字符。特别是,“ã”可以编码为单个字符(U + 00E3,带小写字母的拉丁文小写字母A),也可以编码为两个字符(U + 0061,拉丁文的小写字母A,后跟U + 0303,COMBINING TILDE)。第一种是更标准的“规范化”形式,但在打印时两者看起来相同。科特林看到他们有所不同,但是,因为你已经发现了。

您从哪一个开始,将取决于字符串的来源。 (例如,在用于保存源代码的文本编辑器或从中加载文本文件的文本编辑器上。)

好消息是,无论您以哪种格式开头,都可以使用java.text.Normalizer将其转换为所需的格式:

val normalizedString = Normalizer.normalize(string, Normalizer.Form.NFC)

然后您可以拆分结果(或执行所需的其他任何处理)。

或者,如果您更喜欢分解形式,则可以改用Normalizer.Form.NFD。 (有关更多信息,请参见Oracle's tutorial。您还可以使用Normalizer进行其他处理,例如remove diacritics。)

顺便说一句,这意味着您的getListOfWords()函数没有任何问题。好吧,除了名称之外,因为它实际上并不是拆分单词,但是我想这是一个正在进行的工作!如果您真的想分割字符,则内置的“ String.toList()”功能完全一样。