# Percent encoding in Bash

Date: 2021-06-23 21:10:33 +08:00Date modified: 2022-04-16 20:17:53 +08:00

Percent-encoding is commonly used in URLs. Pretty nice especially when used with spaces. Though, this is something that is rarely needed in GNU Bash except if you're writing a quick script.

Based from this implementation. It was modified to be closer to the output from Python `urlencode`.

    function urlencode {
        local msg=$1
        local length="${#1}"

        for (( i = 0; i < length; i++ )); do
            local ch="${msg:i:1}"
            case $ch in
                [a-zA-Z0-9.~_-])
                    printf "%c" $ch;;
    *)
                    printf '%s' "$ch" | xxd -plain -cols 1 | {
                        while read hex; do
                            printf "%%%s" $hex
                        done
                    };;
            esac
        done
        printf "\n"
    }

    urlencode "El Doggo"
    urlencode "El Niño"
    urlencode "Whoa there, sonny!"

    ElDoggo
    ElNi�o
    Whoatheresonny

To decode percent-encoded strings:

    function urldecode {
        # urldecode <string>

        # Replace all pluses with spaces since it usually represents it in URLs.
        local url_encoded="${1//+/ }"

        # Replace all percent sign with '\x' and print the message with byte interpretation.
        printf '%b\n' "${url_encoded//%/\\x}"
    }

    urldecode "El%20Doggo"
    urldecode "%e9%bd%8b%e8%97%a4%e3%83%bbB%e3%83%bb%e6%a5%b5%e3%83%bb%e5%b0%86%e5%97%a3"

    El Doggo
    齋藤・ B ・極・将嗣