使用 shell 写 cgi 程序时, 从 QUERY_STRING 获取的由 url 或者 form 表单提交的字串已经是经过 urlencode 的了.
php 的 中有 urlencode 和 urldecode 来对字串进行解码. 但 shell 中没有.
今天恰好要用, 就搜索了一下, 找到一个使用 awk 来进行 urldecode 的脚本, 参见http://www.chinaunix.net/bbsjh/11/617.html , 复制下来无法直接进行, 做了一点调整之后好用了, 另外其中的 空格" " 转 "+" 的做反了.
因此, 在处理这个字串时得先进行 urldecode
urldecode.awk
[code:1]
#!/usr/bin/awk -f
BEGIN {
hextab="0123456789ABCDEF"
for ( i=1; i<=255; ++i ) ord [i] = sprintf("%c",i);
}
{
decoded = ""
for ( i=1; i<=length ($0); ++i ) {
c = substr ($0, i, 1)
if ( c ~ /[a-zA-Z0-9.-]/ ) {
decoded = decoded c # safe character
} else if ( c == "+" ) {
decoded = decoded " " # special handling
} else if ( c == "%" ) {
hi= substr($0,i+1,1);
low=substr($0,i+2,1);
i++;i++
decoded = decoded ord[(index(hextab,hi)-1)*16+index(hextab,low)-1]
}
}
}
END {print decoded}
[/code:1]
注意, 如果你的 awk 程序路径不一样, 请按实际情况修改.
实例:
[code:1]
$> echo "abc%2Babc+abc" | urldecode.awk
abc+abc abc
$> echo "%D6%D0%B9%FA%D6%D0%B9%FA " | urldecode.awk
中国中国
[/code:1]