Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin中(可能)编码未知的文件I/O_Kotlin_Io_Character Encoding - Fatal编程技术网

Kotlin中(可能)编码未知的文件I/O

Kotlin中(可能)编码未知的文件I/O,kotlin,io,character-encoding,Kotlin,Io,Character Encoding,这是我第一次尝试学习和使用Kotlin。我有一个简单的任务:逐行读取文件,预处理每一行,并将特定部分放入地图。每一行都是用制表符分隔的 当试图进行预处理时,事情开始变得非常糟糕。我试着调试,我看到的不是普通字符,而是: 在每两个相邻的可读字符之间,就有一个带有水平线的奇怪块 以下是我编写的代码: fun mapUserToId(path: String): MutableMap<String, Int> { val user2id = mutableMapOf<Str

这是我第一次尝试学习和使用Kotlin。我有一个简单的任务:逐行读取文件,预处理每一行,并将特定部分放入地图。每一行都是用制表符分隔的

当试图进行预处理时,事情开始变得非常糟糕。我试着调试,我看到的不是普通字符,而是:

在每两个相邻的可读字符之间,就有一个带有水平线的奇怪块

以下是我编写的代码:

fun mapUserToId(path: String): MutableMap<String, Int> {
    val user2id = mutableMapOf<String, Int>()
    val bufferedReader = File(path).bufferedReader()
    bufferedReader.useLines { lines ->
        lines.drop(1).forEach { // dropping the first line with column headers
            val components: List<String> = it.trim().split("\t") // split by tab delimiter
            val user: String = components[2]
            println(user.length) // length is nearly double due to the strange block-like characters
            val id: String = components[3]
            user2id[user] = id.toInt() // fails due to number format exception, because of those block-like characters
        }
    }
    return user2id
}
funmapusertoid(路径:字符串):可变映射{
val user2id=mutableMapOf()
val bufferedReader=文件(路径).bufferedReader()
bufferedReader.useLines{lines->
lines.drop(1).forEach{//删除带有列标题的第一行
val components:List=it.trim().split(“\t”)//按制表符分隔符拆分
val用户:字符串=组件[2]
println(user.length)//由于类似块的奇怪字符,长度几乎是原来的两倍
val id:String=组件[3]
user2id[user]=id.toInt()//由于数字格式异常而失败,因为这些类似于块的字符
}
}
返回user2id
}

这看起来像是一个字符集问题,但我不知道该字符集可能是什么,以及如何在上面的代码中指定该字符集。在
vim
中打开文件看起来非常正常(如中所示,人们可能会怀疑此文件具有UTF-8编码)。

这确实是一个编码问题。通过在创建缓冲读取器时指定编码来解决此问题,如下所示:

val bufferedReader: BufferedReader = File(path).bufferedReader(Charsets.UTF_16)

vim可能会尝试几种不同的编码,直到找到一种看起来有效的编码;因此,在vim中加载并不一定表示特定的编码。您可以通过键入
:set fenc
查看vim决定了什么。(根据Chthonic Project的回答,我猜它实际上是UTF_16,您看到的奇怪字符来自
\0
字节。)