How to decode URL-encoded and URL query strings in Kotlin

2 Answers

0 votes
import java.net.URLDecoder
import java.nio.charset.StandardCharsets

/**
 * Decodes a URL-encoded string or query component.
 * Automatically handles percent-encoding (%xx) and '+' to space conversion.
 */
fun decodeUrlString(encodedStr: String): String {
    return try {
        // URLDecoder handles both %xx escapes and '+' to space conversion
        URLDecoder.decode(encodedStr, StandardCharsets.UTF_8.name())
    } catch (e: Exception) {
        println("Decoding error: ${e.message}")
        encodedStr
    }
}

fun main() {
    // Example 1: Standard URL encoding with special characters
    val sample1 = "Hello%20World%21%20Kotlin%20%26%20Web"
    println("--- Example 1: Standard URL Encoding ---")
    println("Encoded: $sample1")
    println("Decoded: ${decodeUrlString(sample1)}")

    // Example 2: Form query string fragment encoding (spaces represented as '+')
    val sample2 = "Jane+Doe+from+New+York"
    println("\n--- Example 2: Form Fragment Encoding ---")
    println("Encoded: $sample2")
    println("Decoded: ${decodeUrlString(sample2)}")
}


/*
run:

--- Example 1: Standard URL Encoding ---
Encoded: Hello%20World%21%20Kotlin%20%26%20Web
Decoded: Hello World! Kotlin & Web

--- Example 2: Form Fragment Encoding ---
Encoded: Jane+Doe+from+New+York
Decoded: Jane Doe from New York

*/

 



answered 42 minutes ago by avibootz
0 votes
import java.net.URLDecoder
import java.nio.charset.StandardCharsets

/**
 * Parses and decodes a complete URL query string into a Map.
 * Groups duplicate keys into a List of values.
 */
fun parseAndDecodeQuery(queryString: String): Map<String, List<String>> {
    // Remove leading '?' if present
    val cleanQuery = if (queryString.startsWith("?")) queryString.drop(1) else queryString

    if (cleanQuery.isEmpty()) {
        return emptyMap()
    }

    // Split query by '&' into individual key-value pairs, decode them, and group by key
    return cleanQuery.split("&")
        .map { param ->
            val parts = param.split("=", limit = 2)
            val key = URLDecoder.decode(parts[0], StandardCharsets.UTF_8.name())
            val value = if (parts.size > 1) {
                URLDecoder.decode(parts[1], StandardCharsets.UTF_8.name())
            } else {
                ""
            }
            key to value
        }
        .groupBy({ it.first }, { it.second })
}

fun main() {
    val fullQuery = "search=kotlin+tutorial&category=programming&tag=beginner&tag=android"

    println("--- Full Query String Parsing ---")
    println("Original Query: $fullQuery")

    val decodedMap = parseAndDecodeQuery(fullQuery)

    println("Decoded Map Result:")
    decodedMap.forEach { (key, values) ->
        println("  $key -> $values")
    }
}


/*
run:

--- Full Query String Parsing ---
Original Query: search=kotlin+tutorial&category=programming&tag=beginner&tag=android
Decoded Map Result:
  search -> [kotlin tutorial]
  category -> [programming]
  tag -> [beginner, android]

*/

 



answered 41 minutes ago by avibootz
...