URL编码的小脚本

URL编码的小脚本

很多时候我们会遇到类似这样的字符串“%E5%8F%AF%E5%8F%AF%E7%86%8A”,如果你稍有经验就应该知道这是URL编码的汉字.

URL编码的产生是因为在URL只有少量的字符可以被使用:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm这里有一篇介绍URL编码的文章。

为了方便把“%E5%8F%AF%E5%8F%AF%E7%86%8A”这样的字符串转换为我们可读字符串,我写了这个小工具;同时可以做反向的转换。例如把"可可熊"转换为“%E5%8F%AF%E5%8F%AF%E7%86%8A”。

做个示例,使用该程序在命令行下获取“\”的URL编码:
[cocobear@cocobear sn]$ ./url2read.py -r ""'\'""
GBK:
%5C
UTF8:
%5C

注意这里由于存在shell的解释,需要这样把“\”围起来。

这个脚本可以很好的在Linux与Windows下使用,贴代码:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
#coding: utf-8
#author:        cocobear
#version:       0.1

import urllib
import sys,getopt,re
__doc__ = """Usage:
            ./url2read.py -h
            ./url2read.py -r [url]ftp://cocobear.info/[/url]中国
            ./url2read.py [url]http://cocobear.info/%E4%B8%AD%E5%9B%BD[/url]
        """

def url2read(s):

    s = urllib.unquote(s)
    try:
            s = s.decode('utf-8')
    except UnicodeDecodeError:
            s = s.decode('gbk')
    finally:
            print s.encode(sys.stdin.encoding)


def read2url(s):
    head = ''
    g = re.search('^(http|ftp://)(.*)',s)
    if g:
        head = g.group(1)
        s = g.group(2)
    gbk = urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))

    utf8 = urllib.quote(s.decode(sys.stdin.encoding).encode('utf-8'))
    if gbk == utf8:
        print head+gbk
        return 0
    else:
        print "UTF8:\n"+head+utf8
        print "GBK:\n"+head+gbk
        return 0

def main(argv=None):
    f = False
    if len(sys.argv) < 2:
        print __doc__
        return 1
    try:
        opts,args = getopt.getopt(sys.argv[1:],"h,r",["help","reverse"])
    except getopt.error,msg:
        print msg
        print __doc__
        return 1
    for o,a in opts:
        if o in ("-h","--help"):
            print __doc__
            return 0
        if o in ("-r","--reverse"):
            f = True
    for arg in args:
        if f:
            return read2url(arg)
        else:
            return url2read(arg)
   
   
if __name__ == "__main__":
    sys.exit(main())

先感谢下分享。。

提个小建议:修改下,呵呵,从你博客直接考过来的可能显示会有问题。

源码也不好下载,apache报错。
那句:

[Copy to clipboard] [ - ]
CODE:
if gbk==utf8

是为了无中文时只打印一行?
嗯,呵;
源码是DH的服务器会对py文件进行解释,所以不能下载;
就不提供那个下载了;
代码结构严谨,赞。

要是多一些这种帖子,python 版就会越来越好。
我们设备里面大量这种解码,不过是用C写的,其实不止url里面采用这样的编码,很多http post数据也采用hex编码,http post采用的编码包括unicode、mime、xml,其中unicode基本上都是hex编码。
嗯,HTTP里GET和POST数据都是要经过URL编码的;
学了啊
初学啊。能加上注释那更好。
谢谢分享