2008年08月11日

很多时候我们会遇到类似这样的字符串“%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."

这里有一篇介绍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下使用,贴代码:

:
  1. #!/usr/bin/env
  2. #coding: utf-8
  3. #author:        cocobear
  4. #version:       0.1
  5.  
  6. import urllib
  7. import sys,getopt,re
  8. __doc__ = """Usage:
  9.            ./url2read.py -h
  10.            ./url2read.py -r ftp://cocobear.info/中国
  11.            ./url2read.py http://cocobear.info/%E4%B8%AD%E5%9B%BD
  12.        """
  13.  
  14. def url2read(s):
  15.  
  16.     s = urllib.unquote(s)
  17.     try:
  18.             s = s.decode('utf-8')
  19.     except UnicodeDecodeError:
  20.             s = s.decode('gbk')
  21.     finally:
  22.             print s.encode(sys.stdin.encoding)
  23.  
  24.  
  25. def read2url(s):
  26.     head = ''
  27.     g = re.search('^(http|ftp://)(.*)',s)
  28.     if g:
  29.         head = g.group(1)
  30.         s = g.group(2)
  31.     gbk = urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
  32.  
  33.     utf8 = urllib.quote(s.decode(sys.stdin.encoding).encode('utf-8'))
  34.     if gbk == utf8:
  35.         print head+gbk
  36.         return 0
  37.     else:
  38.         print "UTF8:\n"+head+utf8
  39.         print "GBK:\n"+head+gbk
  40.         return 0
  41.  
  42. def main(argv=None):
  43.     f = False
  44.     if len(sys.argv) <2:
  45.         print __doc__
  46.         return 1
  47.     try:
  48.         opts,args = getopt.getopt(sys.argv[1:],"h,r",["help","reverse"])
  49.     except getopt.error,msg:
  50.         print msg
  51.         print __doc__
  52.         return 1
  53.     for o,a in opts:
  54.         if o in ("-h","--help"):
  55.             print __doc__
  56.             return 0
  57.         if o in ("-r","--reverse"):
  58.             f = True
  59.     for arg in args:
  60.         if f:
  61.             return read2url(arg)
  62.         else:
  63.             return url2read(arg)
  64.    
  65.    
  66. if __name__ == "__main__":
  67.     sys.exit(main())

代码下载

标签 :

4 楼了已经

  • luguo写于08年08月11日

    恩,这个简单易懂~

  • Amankwah写于08年08月11日

    这个不错~

  • shuge.lee写于08年09月14日

    yuki@yukilib /home/share/code/python_note $ ./url2read.py http://www.shuge.org/中文
    File "./url2read.py", line 12
    SyntaxError: Non-ASCII character '\xe4' in file ./url2read.py on line 13, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
    yuki@yukilib /home/share/code/python_note $

    怎么回事?

  • 可可熊写于08年09月16日

    使用参数-r,需要反转。

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« Python做的小工具
» crontab使用[转载]