wiki/structured/cookbook.bash.percent-encoding.org
Gabriel Arazas 377850d0d1 Update notebook and clean up the folder
I also forget to add the additional solutions from the Exercism
exercises. Whoops...

I'm also getting used to storing code in random places. Time to change
that habit a little bit by storing them in my notebook, instead.
Nothing wrong with that, yeah?!
2021-06-25 13:30:07 +08:00

1.4 KiB

Percent encoding in Bash

Percent-encoding is commonly used in URLs. Pretty nice especially when used with spaces.

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>

    local url_encoded="${1//+/ }"
    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 ・極・将嗣