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
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
相關網頁
相關
作者: Tsung
對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.檢視「Tsung」的全部文章