String 字符串列表中的unicode字符

String 字符串列表中的unicode字符,string,list,unicode,kotlin,char,String,List,Unicode,Kotlin,Char,我需要将一个字符串分解为一个字符列表。但是我的字符串可以有一些特殊的字符,比如“lã”,我想把它打断,它会给我一个包含三个项目的列表[“l”,“a”,“~”]。我怎样才能得到一个只有[“l”,“ã”]的列表。这是我的密码。这是因为我已经试过几次了 fun getListOfWords (string: String) : List<String> { val list = arrayListOf<String>() for(i in 1 .. string

我需要将一个字符串分解为一个字符列表。但是我的字符串可以有一些特殊的字符,比如“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
}
fun getListOfWords(string:string):列表
{
val list=arrayListOf()
for(i在1..string.length中)
list.add(string.substring(i-1,i))
返回列表
}

当我像getListofWord(“lã”)一样使用它时。它给了我正确的输入,但是如果我有一个字符串x=“lã”并使用getListofWord(x),它会给我[“l”,“a”,“~”])。

这是关于Unicode规范化的

Unicode非常灵活,有多种方式对某些字符进行编码。特别是,“ã”可以编码为单个字符(U+00E3,带波浪号的拉丁小写字母a)或两个字符(U+0061,拉丁小写字母a,后跟U+0303,组合波浪号)。第一种是更标准的“规范化”形式,然而,正如你所发现的,科特林对它们的看法不同

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

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

val normalizedString = Normalizer.normalize(string, Normalizer.Form.NFC)
然后,您可以分割结果(或执行您想要的任何其他处理)

或者,如果您更喜欢分解的表单,可以使用
Normalizer.form.NFD
(有关更多信息,请参阅。您还可以使用Normalizer进行其他处理,例如。)

顺便说一句,这意味着你的
getListoWords()
函数没有问题。好吧,除了名称之外,因为它实际上没有拆分单词,但我想这是一项正在进行的工作!如果您真的想拆分字符,内置的“String.toList()”函数也会执行相同的操作