Файловый ввод / вывод в Котлине с (потенциально) неизвестной кодировкой - PullRequest
0 голосов
/ 30 ноября 2019

Это моя первая попытка изучить и использовать Kotlin. У меня есть простая задача: прочитать файл построчно, предварительно обработать каждую строку и поместить определенную часть в карту. Каждая строка разделена табуляцией.

При попытке предварительной обработки, все начинает идти ужасно неправильно. Я попытался отладить, и вместо обычных символов я вижу следующее:

screenshot from IntelliJ IDEA debugger

Между каждыми двумяРядом с читаемыми символами есть странный блок с горизонтальными линиями.

Вот код, который я написал:

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).

1 Ответ

1 голос
/ 01 декабря 2019

Это действительно проблема кодирования. Проблема решается путем указания кодировки при создании буферизованного считывателя следующим образом:

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