免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4774 | 回复: 9
打印 上一主题 下一主题

URL编码的小脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-11 16:45 |只看该作者 |倒序浏览
很多时候我们会遇到类似这样的字符串“%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下使用,贴代码:

  1. #!/usr/bin/env python
  2. #coding: utf-8
  3. #author:        cocobear
  4. #version:       0.1

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

  12. def url2read(s):

  13.     s = urllib.unquote(s)
  14.     try:
  15.             s = s.decode('utf-8')
  16.     except UnicodeDecodeError:
  17.             s = s.decode('gbk')
  18.     finally:
  19.             print s.encode(sys.stdin.encoding)


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

  27.     utf8 = urllib.quote(s.decode(sys.stdin.encoding).encode('utf-8'))
  28.     if gbk == utf8:
  29.         print head+gbk
  30.         return 0
  31.     else:
  32.         print "UTF8:\n"+head+utf8
  33.         print "GBK:\n"+head+gbk
  34.         return 0

  35. def main(argv=None):
  36.     f = False
  37.     if len(sys.argv) < 2:
  38.         print __doc__
  39.         return 1
  40.     try:
  41.         opts,args = getopt.getopt(sys.argv[1:],"h,r",["help","reverse"])
  42.     except getopt.error,msg:
  43.         print msg
  44.         print __doc__
  45.         return 1
  46.     for o,a in opts:
  47.         if o in ("-h","--help"):
  48.             print __doc__
  49.             return 0
  50.         if o in ("-r","--reverse"):
  51.             f = True
  52.     for arg in args:
  53.         if f:
  54.             return read2url(arg)
  55.         else:
  56.             return url2read(arg)
  57.    
  58.    
  59. if __name__ == "__main__":
  60.     sys.exit(main())


复制代码

[ 本帖最后由 可可熊 于 2008-8-11 17:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-11 17:07 |只看该作者
先感谢下分享。。

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

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

论坛徽章:
0
3 [报告]
发表于 2008-08-11 17:12 |只看该作者
那句:


  1. if gbk==utf8
复制代码


是为了无中文时只打印一行?

论坛徽章:
0
4 [报告]
发表于 2008-08-11 17:17 |只看该作者

回复 #3 retuor 的帖子

嗯,呵;

论坛徽章:
0
5 [报告]
发表于 2008-08-11 17:19 |只看该作者

回复 #2 xiaoyu9805119 的帖子

源码是DH的服务器会对py文件进行解释,所以不能下载;
就不提供那个下载了;

论坛徽章:
0
6 [报告]
发表于 2008-08-11 17:24 |只看该作者
代码结构严谨,赞。

要是多一些这种帖子,python 版就会越来越好。

论坛徽章:
0
7 [报告]
发表于 2008-08-11 17:34 |只看该作者

经常碰到对这类hex编码进行解码的问题

我们设备里面大量这种解码,不过是用C写的,其实不止url里面采用这样的编码,很多http post数据也采用hex编码,http post采用的编码包括unicode、mime、xml,其中unicode基本上都是hex编码。

论坛徽章:
0
8 [报告]
发表于 2008-08-12 09:25 |只看该作者

回复 #7 cjcse 的帖子

嗯,HTTP里GET和POST数据都是要经过URL编码的;

论坛徽章:
0
9 [报告]
发表于 2008-08-12 09:35 |只看该作者
学了啊

论坛徽章:
0
10 [报告]
发表于 2008-08-12 15:21 |只看该作者
初学啊。能加上注释那更好。
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP