首页 > 解决方案 > Kotlin 中具有(可能)未知编码的文件 I/O

问题描述

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

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

IntelliJ IDEA 调试器的屏幕截图

在每两个相邻的可读字符之间,有一个看起来很奇怪的带有水平线的块。

这是我写的代码:

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
}

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

标签: kotliniocharacter-encoding

解决方案


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

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

推荐阅读