【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

linux下使用bash进行url编码的两种方法

上一篇 / 下一篇  2009-07-24 19:59:31 / 个人分类:bash

看到网上广为流传的一篇文章,使用awk与od对汉字进行url编码。本来想拿来用的,结果发现通用性也太不好了,如果哦不是汉字什么的,就编码出错。
原文地址  http://linux.ccidnet.com/art/302/20061009/916847_1.html
后来感觉这个urlquote编码很常用,很多地方都用到了。使用我原来的的方法有些限制,就重新使用od再实现了一个。
分享下。


我原来的解决方式是在shell中调用python去编码,代码如下。

urlquote()
{
    [[ $# = 0 ]]&&echo urlquote string&&return
    echo "#coding=utf-8;
import urllib,sys;print urllib.quote('$1');" |python
}

小技巧,这是shell语句,其实却是调用的python。大家以后使用shell不爽的话,可以在shell中调用python,ruby之类的,都是可以的。要想歪点子。呵呵。
需要注意的是,格式要拍好,因为python是靠缩进来判断语句的。vi的默认缩进,容易把格式搞乱。


但是这种方式依赖python,如果机器上没有的话,就很麻烦。另外效率也是个问题。的确用python慢一些。
看到了网上有人使用od来获得16进制数据来拼装,我也就使用od去拼装吧。
网上的那位仁兄使用awk处理的那么麻烦,其实是忽略了od的-x1 参数。使用单个字节就可以了。
默认的两个字节显示的话,顺序上是颠倒的。


:<<url_help
used for replace urlquote
url 123xxxxxx
url_help
urlquote()
{
    local msg=`echo "$*"|od -t x1 -A n|xargs|tr -d '*'|tr " " %`  #使用od转换为16进制,同时把空格换成%,正好实现了url编码。
    msg=${msg/$msg/%$msg}  #加上头部缺少的%
    echo ${msg%\%0a}  #去掉最后多余的%oa。od生成的。
}


不过在编码大数据量的时候,od会进行一些特殊的处理,比如加星号之类的,所以我重新修改了下。
要是想干脆点的话,直接使用如下代码即可。
echo 你要编码的文字|od -t x1 -A n -v -w10000000000 | tr " " %


下面我是写的一个比较完备的方式。可以支持多种调用方式,也可以与以前的方式兼容。使用的时候,使用如下三种方式调用就可以。
urlquote  你要编码的文字
echo 你要编码的文字|urlquote
urlquote < 你的文件 

详细代码。




[huangysh@qa16 ~]$ qahelp urlquote
=========================
:<<urlquote_help
used for replace urlquote
urlquote 123xxxxxx
urlquote mesage"fsef
fsefsf"  #support for multiline
urlquote_help
=========================

========source code=========
urlquote is a function
urlquote ()
{
    [[ -n $* ]] && {
        echo "$*" | od -t x1 -A n -v -w10000000000 | tr " " %;
        return
    };
    while read line; do
        echo -n $(echo "$line"|od -t x1 -A n -v|tr " " %) | tr -d " ";
    done;
    echo
}
============================



==========================

最近从网上搜索资料,发现这个blog排名满靠前的。
上面介绍的方法之适合处理少量的文本,如果你的文本有上百万行,性能与时间就是问题了。解决方法很简单。直接使用python或者ruby去处理即可。echo,read line之类的命令就可以丢掉了。

ruby的推荐如下。

使用urlquote_ruby 文件名   即可。
速度绝对没的说。

urlquote_ruby()
{
    local f=$1
    ruby -e "require 'cgi';IO.foreach('"$f"') { |line| puts CGI.escape(line.chomp) }"
}





TAG:

 

评分:0

我来说两句

Open Toolbar