如何从被编码后的url地址,解码出原始url地址
此处,就来解释一下,如何从上述的,被编码后的值,解码出原始的url地址。
Python中通过urllib.unquote,可以解码出原始url地址
相关代码为:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【整理】关于http(GET或POST)请求中的url地址的编码和解码
http://www.crifan.com/summary_the_url_encode_and_decode_during_http_get_post_request
Version: 2012-11-20
Author: Crifan
"""
import urllib;
encodedUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html";
decodedUrl = urllib.unquote(encodedUrl);
print "encodedUrl=\t%s\r\ndecodedUrl=\t%s"%(encodedUrl, decodedUrl);
#encodedUrl= http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html
#decodedUrl= <a href="http://www.baidu.com/cache/user/html/jump.html">http://www.baidu.com/cache/user/html/jump.html</a>
当然,也可以直接通过Python的IDLE去做同样的操作:
如何对原始的url地址进行编码
想要将原始的url地址,比如上面的
http://www.baidu.com/cache/user/html/jump.html
编码为:
http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html
不同的语言,都有对应不同的函数使用此功能的。
不过在介绍不同语言的实现方法之前,先要解释清楚,一般的字符的值,都是如何进行编码的。
其实,将某个字符,编码为对应的值,就是将其值变为%xx而已,而xx就是该字符的16进制值而已。
字符所对应的16进制值,不了解的,可以去查表:
不过,一般来说,记住下面,我所列出来的,最最常见的,也就基本够用了:
不过,很明显,上面说过了,如何转换,是利用函数去操作的,不用你关系。
你所关系的,是使用什么函数而已。
另外,还需要注意一点的是,一般来说,空格’ ‘,都是和其他字符一样,被编码为对应16进制形式,即%20,
但是空格却是被编码为加号’+'的。
所以,也因此,有两套不同的函数:
Python中的url地址编码函数
Python相关函数:
将空格编码为%20:urllib.quote
urllib.quote(string[, safe])
Replace special characters in string using the %xx escape. Letters, digits, and the characters '_.-' are never quoted. By default, this function is intended for quoting the path section of the URL. The optional safe parameter specifies additional characters that should not be quoted — its default value is '/'.
Example: quote('/~connolly/') yields '/%7econnolly/'.
将空格编码为加号’+':urllib.quote_plus
urllib.quote_plus(string[, safe])
Like quote(), but also replaces spaces by plus signs, as required for quoting HTML form values when building up a query string to go into a URL. Plus signs in the original string are escaped unless they are included in safe. It also does not have safe default to '/'.
为何url地址不是直接发送到服务器,而是被编码后再发送?
首先,先说一下,关于为何必须将url地址,去编码后,再发送,是因为相关的协议规范:RFC 1738,定义了,url地址中,不能包含,除了,0-9的数字,大小写字母(a-zA-Z),短横线’-’
之外的字母,
换句话说,如果其中包括了很多特殊符合,比如$-_.+!*’(),
那么都要尽量编码。
而关于为何要这么定义,经过一番简单调查,基本的理由是:
1.本身html代码中,很多特殊字符,就有其本身的特殊含义,比如’#',就适用于定位(html anchor),所以,这类字符,本身有特殊含义的字符,斌直接用于发送,所以需要编码;
2.如果其中本身就包含一些,非打印的控制字符,那么无法正常打印显示,所以必须被编码才能传输。
3.还有些保留字符(&,=,:),不安全字符(<,>,#),所以需要对url地址编码。
4.另外,还有一些,最容易想到的,比如空格,如果出现在一个url地址中间,我们就很难判断,空格前后的内容,是否是属于整个的单一的url的,所以,对于空格这样的特殊字符,肯定是需要编码的。