使用SHELL脚本来进行UrlEncode 和UrlDecode

来源: #   * https://github.com/sixarm/urlencode.sh #   * https://github.com/sixarm/urldecode.sh [root@INTER ~]#cat urlencode.sh urlencode() {     # urlencode <string>...

来源:

#   * 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"


  • 发表于 2016-11-09 17:27
  • 阅读 ( 476 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小A
小A

29 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章