Bash shell 想要送中文等需要被 urlencode 過的文字到網址去,要怎麼做呢?
此篇使用 curl 直接傳送,另外在紀錄 Bash 的 urlencode() / urldecode() 寫法
Bash shell 使用 CURL urlencode 送參數
CURL 想要做 urlencode,需要搭配 --data-urlencode 的參數(--data-urlencode 需要另外搭配 -G),另外不需要 encode 的,一樣可以帶在網址後面即可。
直接看範例比較容易懂,下述範例要傳送三個參數:msg、text、channel,channel 不需要 urlencode,先直接帶在後面即可。
- curl -X GET -G --data-urlencode "msg=abcs" --data-urlencode "text=中文" "http://example.com/?channel=blog"
- 註:若需要 POST,則 -X POST,所有參數都需要加到 --data-urlencode 去。
若不使用 curl,想要於 Bash shell 直接轉譯傳送,下面有兩種 urlencode() 的寫法(將下述寫入 .bashrc 即可),自行挑其一使用:
Bash shell 使用 curl 來達成 urlencode 所需命令
function urlencode() { local data if [[ $# != 1 ]]; then echo "Usage: $0 string-to-urlencode" return 1 fi data="$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")" if [[ $? != 3 ]]; then echo "Unexpected error" 1>&2 echo "${data##/?}" return 0 }
使用方式
- $ echo http://example.com/q?=$( urlencode "中文" )
Bash shell 的 urlencode() / urldecode()
下述整理自此篇:Bash urlencode and urldecode # 註:此篇最上面的不能用,往下翻的才有正確能用的版本
Bash shell 使用 xxd 來達成 urlencode 所需計算
function urlencode() { local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done esac done }
function urldecode() { # urldecode <string> local url_encoded="${1//+/ }" printf '%b' "${url_encoded//%/\\x}" }