Неверное кодирование с использованием URL (). ReadText () с Kotlin - PullRequest
0 голосов
/ 11 февраля 2020

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

val apiResponse = URL("https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow")
        .readText(Charset.forName("ISO-8859-1"))
println(apiResponse)

Я пытаюсь использовать "UTF-8", но в результате получается такой же, полный плохо закодированных символов. Почему?

1 Ответ

2 голосов
/ 12 февраля 2020

Сервер возвращает веб-страницу, сжатую с помощью gzip , поэтому он, естественно, содержит множество неотображаемых символов.

Вы можете подтвердить это без использования Kotlin, например:

$ wget 'https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow'

[output snipped]

$ file 'questions\?order=desc\&sort=activity\&site=stackoverflow'
questions?order=desc&sort=activity&site=stackoverflow: gzip compressed data, from TOPS/20, original size 19820

Вы можете использовать Kotlin, чтобы распаковать его - но это проще, если вы читаете URL как байты, чтобы избежать любых преобразований набора символов:

val url = URL("https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow")
val content = GZIPInputStream(ByteArrayInputStream(url.readBytes()))
    .bufferedReader()
    .use { it.readText() }
...