看到网上广为流传的一篇
文章,使用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) }"
}