kotlin - Kotlin 中具有(可能)未知编码的文件 I/O
问题描述
这是我第一次尝试学习和使用 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
}
这看起来像一个字符集问题,但我无法弄清楚字符集可能是什么,以及如何在上面的代码中指定该字符集。打开文件vim
看起来非常正常(如,有人会怀疑这个文件有 UTF-8 编码)。
解决方案
这确实是一个编码问题。通过在创建缓冲读取器时指定编码来解决问题,如下所示:
val bufferedReader: BufferedReader = File(path).bufferedReader(Charsets.UTF_16)
推荐阅读
- asp.net-core - 将带有标签助手的 html 渲染到字符串变量中
- flutter - 如何在 Flutter 中制作打开随机页面的按钮?
- flutter - Flutter:如何在调用构造函数后有条件地在 ChangeNotifier 中运行方法
- regex - 使用 RegEx 删除两个字符串之间的所有回车和换行
- primefaces - Primefaces:模态对话框:外观
- module - 为什么 Rust 允许公开访问私有模块?
- bash - 用于检查 PDF 文件内容的 Shell 脚本
- android - 库中的 FileProvder 安全异常
- python - 熊猫数据框根据条件从同一数据框中的两列中减去值?
- jenkins - Jenkins 管道如何更改到另一个文件夹并运行 npm 测试