zoukankan      html  css  js  c++  java
  • url编码与解码

    为何要将URL地址进行编码 然后发送到服务器端? 

    协议规范:RFC 1738,定义了,url地址中,不能包含,除了,0-9的数字,大小写字母(a-zA-Z),短横线’-’之外的字母,但是我们的URL中不止这些字符还有一些特殊字符比如$-_.+!*’(),这时候就需要我们进行编码传输。编码很简单,就是将其值变为%xx而已,而xx就是该字符的16进制值而已。下面的表取自百度百科,大家可以参考一下。

    backspace %08
    I %49
    v %76
    ó %D3
    tab %09
    J %4A
    w %77
    Ô %D4
    linefeed %0A
    K %4B
    x %78
    Õ %D5
    creturn %0D
    L %4C
    y %79
    Ö %D6
    space %20
    M %4D
    z %7A
    Ø %D8
    ! %21
    N %4E
    { %7B
    ù %D9
    " %22
    O %4F
    | %7C
    ú  %DA
    # %23
    P %50
    } %7D
    Û %DB
    $ %24
    Q %51
    ~ %7E
    ü %DC
    % %25
    R %52
    ¢ %A2
    Y %DD
    & %26
    S %53
    £ %A3
    T %DE
    ' %27
    T %54
    ¥ %A5
    ß %DF
    ( %28
    U %55
    | %A6
    à %E0
    ) %29
    V %56
    § %A7
    á %E1
    * %2A
    W %57
    « %AB
    a %E2
    + %2B
    X %58
    ¬ %AC
    ã %E3
    , %2C
    Y %59
    ˉ %AD
    ä %E4
    - %2D
    Z %5A
    o %B0
    å %E5
    . %2E
    [ %5B
    ± %B1
    æ %E6
    / %2F
    %5C
    a %B2
    ç %E7
    0 %30
    ] %5D
    , %B4
    è %E8
    1 %31
    ^ %5E
    μ %B5
    é %E9
    2 %32
    _ %5F
    » %BB
    ê %EA
    3 %33
    ` %60
    ¼ %BC
    ë %EB
    4 %34
    a %61
    ½ %BD
    ì %EC
    5 %35
    b %62
    ¿ %BF
    í %ED
    6 %36
    c %63
    à %C0
    î %EE
    7 %37
    d %64
    á %C1
    ï %EF
    8 %38
    e %65
    Â %C2
    e %F0
    9 %39
    f %66
    Ã %C3
    ñ %F1
    : %3A
    g %67
    Ä %C4
    ò %F2
    ; %3B
    h %68
    Å %C5
    ó %F3
    < %3C
    i %69
    &AElig; %C6
    &ocirc; %F4
    = %3D
    j %6A
    &Ccedil; %C7
    &otilde; %F5
    > %3E
    k %6B
    è %C8
    &ouml; %F6
    %3F
    l %6C
    é  %C9
    ÷  %F7
    @ %40
    m %6D
    ê %CA
    &oslash; %F8
    A %41
    n %6E
    &Euml; %CB
    ù %F9
    B %42
    o %6F
    ì  %CC
    ú  %FA
    C %43
    p %70
    í %CD
    &ucirc; %FB
    D %44
    q %71
    &Icirc; %CE
    ü %FC
    E %45
    r %72
    &Iuml; %CF
    y %FD
    F %46
    s %73
    D %D0
    t %FE
    G %47
    t %74
    &Ntilde; %D1
    &yuml; %FF
    H %48
    u %75
    ò %D2

    基本的理由是:

    1.本身html代码中,很多特殊字符,就有其本身的特殊含义,比如’#',就适用于定位(html anchor),所以,这类字符,本身有特殊含义的字符,斌直接用于发送,所以需要编码;

    2.如果其中本身就包含一些,非打印的控制字符,那么无法正常打印显示,所以必须被编码才能传输。

    3.还有些保留字符(&,=,:),不安全字符(<,>,#),所以需要对url地址编码。

    4.另外,还有一些,最容易想到的,比如空格,如果出现在一个url地址中间,我们就很难判断,空格前后的内容,是否是属于整个的单一的url的,所以,对于空格这样的特殊字符,肯定是需要编码的。

    5.防止SQL注入 

    注意 : 一般来说,空格’ ‘,都是和其他字符一样,被编码为对应16进制形式,即%20,但是空格却是被编码为加号’+'的。

    我们使用python来对url进行编码:urllib.quote(string,[,safe]),urllib.quote_plus(string,[,safe])与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代空格。同样对'/'是默认不安全的。safe参数是可选的,意义是不被编码的安全参数,默认是'/'

    import urllib
    encodedUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html"
    decodedUrl=urllib.unquote(encodedUrl)
    url = urllib.quote(decodedUrl)
    url_plus = urllib.quote_plus(decodedUrl)
    
    print 'encodedUrl',encodedUrl
    print 'decodedUrl',decodedUrl
    print 'url',url
    print 'url_plus',urlplus

    结果,我们可以看到经过解码然后再用quote编码的url与初始的url不同,它没有对'/'进行编码,而quote_plus却进行了编码。

    同样的解码我们使用 urllib.unquote和urllib.unquote_plus。

    接下来我们讲一下urllib模块的其他函数吧,

    urllib.urlopen(url[,data[,proxies]])关于urlopen网上的中英文资料太多了,这儿就不多说了。

    urllib.urlretrieve(url[,filename,[,reporthook[,data]]])

    urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

    Content-Length是一个下界,如果读到的数据大于Content-Length,会继续读入,如果小于,将会触发异常。如果没有Content-Length,urlretrieve将不会检查所下载数据的大小。

    代码来自 : 地址,有一点不是很清楚,就是cbk参数a,b,c是自动传入的?

    # -*- coding: cp936 -*-
    import urllib
    def cbk(a, b, c):
        '''回调函数
        @a: 已经下载的数据块
        @b: 数据块的大小
        @c: 远程文件的大小
        '''
        per = 100.0 * a * b / c
        if per > 100:
            per = 100
        print '%.2f%%' % per
    
    url = 'http://www.sina.com.cn'
    local = 'd://sina.html'
    urllib.urlretrieve(url, local, cbk)

    注意 urlopen和urlretrieve将产生一个FancyURLopen实例,然后使用它来执行请求操作。 

    urllib.urlcleanup():将调用urlretrieve()产生的缓存进行清除 

    urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。

    import urllib
    params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
    f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)#将字典中的参数传递过去 
    print f.read()

    urllib.pathname2url(path):将本地路径转换成url路径;

    url = urllib.pathname2url(r'c:/a/b/c/example.html')
    print url
    location =  urllib.url2pathname(url)
    print location

    urllib.url2pathname(path):将url路径转换成本地路径;

                      

  • 相关阅读:
    【Linux】Vim编辑器-批量注释与反注释
    java_部署jar
    linux_UBUNTU 12.04 上使用 SQUID 架设HTTP正向代理服务器
    crawler_java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件_设置代理
    linux_coom _ Linux文件比较,文本文件的交集、差集与求差
    linux_之sed用法
    算法-跑道与马-百度面试题
    《Python》常用内置模块
    《Python》内置方法进阶和常用模块
    《Python》反射、内置方法(__str__,__repr__)
  • 原文地址:https://www.cnblogs.com/tracylining/p/3467972.html
Copyright © 2011-2022 走看看