问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

get和post的区别并讲解到urlencode和乱码问题

发布网友 发布时间:2022-04-25 20:54

我来回答

2个回答

懂视网 时间:2022-04-18 22:51

urlencode 调用方法

urlencode的参数必须是Dictionary

import urllib
d = {'name1':'www.pythontab.com','name2':'bbs.pythontab.com'}print urllib.urlencode(d)

输出:

name2=bbs.pythontab.com&name1=www.pythontab.com

相当于拼接两个url参数,这个用法类似于PHP中的http_build_query(),这里就不多数PHP中怎么用了,有兴趣的自己去查一下。

urlencode 编码

函数urlencode不会改变传入参数的原始编码,也就是说需要在调用之前将post或get参数的编码调整好。

问题:现在模拟请求Google和baidu,由于baidu使用的是gb2312编码,google使用的是utf8编码,两个站点提交到URL中的中文参数的urlencode值是不一样,下面以”PythonTab中文网”为例:

# coding: UTF-8
str = u'PythonTab中文网'
str = str.encode('gb2312')
d = {'name':str}
q = urllib.urlencode(d)
print q

结果:

name=PythonTab%D6%D0%CE%C4%CD%F8

注意:urlencode的参数必须是Dictionary

其他用法

django中urlencode类似,方法如下:

from django.utils.http import urlquote
a = urlquote('PythonTab中文网')
print a

得到汉字的GBK编码

urllib 转换字符串

其实可以用urllib的quote函数对URL中的中文进行转换,将中文转换成GBK的编码,得到的编码是符合URI标准的URL。

>>> import urllib
>>> a = "PythonTab中文网"
>>> a
'PythonTabxe4xb8xadxe6x96x87xe7xbdx91'
>>> urllib.quote(a)
'PythonTab%E4%B8%AD%E6%96%87%E7%BD%91'
>>>

热心网友 时间:2022-04-18 19:59

form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。

对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc
(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080//servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字 符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了 URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置 浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说 几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传 送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。
2。服务器端(tomcat)是如何将数据获取到进行解码的。
第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带 有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获 取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用 request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方 法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是*为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是 iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据 URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接
Java代码
1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")
还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置
Xml代码
1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>
这样是让tomcat在获取数据后用指定的方式URL decoder,URL decoder的介绍在这里
(二)post提交
1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。
在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?
在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用 什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的 URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。
2。服务器端(tomcat)是如何将数据获取到进行解码的。
如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。
我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何挑选紧致眼霜?有哪些品牌推荐? 怎样挑选抗皱眼霜?有哪些值得安利? 什么品牌的眼霜平价好用? 什么牌子眼霜最好用眼霜十大排名 市面上的大牌抗老眼霜该怎么选? ps4十大最耐玩经营类游戏 推荐点好玩的模拟经营类游戏吧 模拟经营类游戏(模拟经营类游戏简称) 谁有模拟经营版的单机游戏 一个小岛的模拟经营的单机游戏 三系油箱容量 服务器主机与PC个人主机有何具体区别? 初学php,为什么urlencode()没作用呢 谁能告诉我python中urlopen函数data参数的作用和意义? server.urlEncode的使用方法 urlencode进行转换后 为什么空格是+号 不是%20 HttpUtility.UrlEncode这个类是啥意思,什么时候用到呢 HttpUtility.UrlEncode是什么意思? urlencode是什么东西 怎么加密啊 请问server.urlencode和server.htmlencode分别是什么意思和用途呀,请具体介绍一下,谢谢! 为什么要把某些字符串用urlencode编码呢,有什么作用 ...本来是utf-8,为什么还要加上urlencode(“utf-8”) asp中server.urlencode有什么用?怎么用? php 中urlencode的作用是什么不用会怎么样? ipad停用连接itunes是什么意思 鸡蛋怎样腌制出油又好吃?? 什么网站能免费下载ppt文件,急求!!! 请问各位在哪里可以免费下载PPT的的模板 有没有可以下载好看的PPT模板网站啊 葱油肉末千层饼怎么做 葱油酥千层饼怎么做 千层葱油饼怎么做 urlencode( $_REQUEST[ &#39;session_key&#39; ] )是什么意思 Server.UrlEncode();有什么用 asp 数字 英文进行转码怎么搞? urlencode 这个函数不行啊~~~ 无线pos机开机显示请检查sim卡 怎么测试女朋友有没有跟别人微信语音 如何测试我的语音别人能听的到 怎么做语音测试 怎么样去测试语音聊天程序 怎么检查电脑耳机可以语音通话而没有问题? 如何进行多人语音聊天室的测试 语音聊天对方听不见我说话,是不是我麦克风坏了?怎么能知道是不是我麦克风坏了?我没其它麦克风可以试验 语音软件测试的工具有哪些? 请问自己的电脑如何测试有没有语音也就话筒有没有用,谢谢 四川省人社厅电话号码是多少? 如何在四川省人力资源和社会保障厅网上办理档案转接? 四川省人力资源和社会保障厅受理投诉举报有哪些条件? 请问现在的四川省人事厅是否更名为:四川省人力资源和社会保障厅 四川省人力资源和社会保障厅关于进一步做好工伤保险工作若干意见的通知 四川人力资源和社会保障厅我是四川省农村信用社的社保卡 ,我想在网上更换预留手机号应该怎么做_百度问一问 四川省劳动和社会保障厅和四川省人力资源和社会保障厅颁发的证有区别吗_百度问一问