来源:
# * https://github.com/sixarm/urlencode.sh
# * https://github.com/sixarm/urldecode.sh
[root@INTER ~]#cat urlencode.sh
urlencode() {
# urlencode <string>
old_lang=$LANG #原来语言保存到变量old_lang中,以便脚本执行最后恢复
LANG=C #脚本运行的语言环境设置为C ,使用locale -a 查看系统所支持的语言
#LANG=zh_CN.utf8
old_lc_collate=$LC_COLLATE #同上 字符串比较和排序习惯
LC_COLLATE=C
#LC_COLLATE=zh_CN.utf8
local length="${#1}" #取传入字符串的总长度 ${#1} 其中1是传入位置参数$1的内容
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}" #字符串$1 中,从循环i的位置取一个长度,汉字这里会转化为(utf-8) \xE6\x83\x92 格式,分三次取
case $c in #case 选择,如果每次循环取到的字符串为ascii码表内的( [a-zA-Z0-9.~_-]),直接打印
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;; #如果循环取到的字符串不在标准码表内,转换成大写的16进制,宽度为2,不足使用0填充
#16进制前面都加上%号,%%%实际解析只保留一个%占位,%% 相当于% ,
#写成 printf '%%02X' 会直接打印 %02X,后面‘值’不再打印
esac
done
LANG=$old_lang
LC_COLLATE=$old_lc_collate
}
[root@INTER ~]#cat urldecode.sh
urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }" #把$1传入的字符串中包含 '+' 的地方全部使用空格替换 ,例如:${VAR//VAR1/VAR2}
#字符串VAR中包含VAR1的地方使用VAR2全部替换
printf '%b' "${url_encoded//%/\\x}" #处理后的url_encoded中包含%的地方全部使用\x替换
#printf '%b'可以解析以\x 开头的字符串,但以\x0 之类的除外
#例如,printf '%b' "\xE6\x88\x91" ,还原为汉字"我"
}
urldecode "$1"
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!