用Get方式传中文参数存在很多问题!一不小心就会造成服务器收到的是乱码!所以一般情况下,都是尽量使用Post方法实现中文参数的传参。但是有的时候会出现意料之外的情况不得不用Get方法。解决方法有很多: 接下来详细解释下其中原委! 这要从Http协议开始说起。Http通讯协议分为头部、实体两个部分。实体部分是可选的,如Get方法就不一定需要。当返回Get的请求时,实体部分的编码是根据头部中的content的值决定的。例如:Content-Type:text/html; charset=UTF-8这就设定了实体的编码为utf-8格式。 对于get方法来说,都是把数据串联在请求的url后面作为参数,url拼接完成后,浏览器会对url进行URI encode,然后发送给服务器。URI encode的过程就是把部分的url做为字符,按照某种编码方式(如:utf-8,gbk等,各浏览器不同)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 “%xy” 表示,其中xy为该字节的两位十六进制表示形式。另外也会将空格替换成”+”。详细过程可以参看JDK源码中的URIEncode类的实现。 可以看到“各浏览器的编码不同”且用户可以自己设置默认编码,这导致了很多不同可能。这也就是为什么IE可以firefox乱码,这个机器可以另一台机器乱码的根源。你无法确定不同的浏览器是使用了什么编码对URI中的非ASCII字符进行编码的,所以你无法在服务器是确定自己使用什么解码。更要命的是不同的服务器也有自己默认的解码。例如Tomcat的解码格式为ISO-8859-1(可以修改server.xml修改)。 在开篇时一共提到了三个解决方案,第二三种因为将参数放到了实体部分所以很安全放心,这两种编码你可以通过程序方便的控制。但它们都有局限性不能作为通用方案。所以第一种方案最可行。 具体的步骤: 首先了解下encodeURI与encodeURIComponent函数 encodeURI与encodeURIComponent都是将字符串进行URI encode(都使用utf-8编码),过程之前已经提到过了,但是有所区别。encodeURI有以下字符不会被编码:“!@#$&*()=:/;?+”,另外encodeURIComponent方法有以下字符不会被编码:“!*()”。浏览器的默认URI encode则是所有ASCII字符不会被编码。 为什么编码两次,解码一次呢? 首先浏览器只会对非ASCII字符进行编码,所以在经过两次或一次encodeURI编码之后,浏览器的编码不会起作用。那为什么要进行两次编码呢? 因为不确定服务器端是使用何种编码进行URI的解码。当然如果你很确信你使用的平台是固定的那就不需要了。如果想要代码跨平台则需要考虑。光这么将不够直接,看下的过程(假设服务器为Tomcat): “中文” ?==encodeURI==> ?”%E4%B8%AD%E6%96%87″ ?==encodeURI(%被编码)==> ?”%25E4%25B8%25AD%25E6%2596%2587″ ? ==Tomcat解码(ISO-8859-1)==> ???”%E4%B8%AD%E6%96%87″ ==Java decode(UTF-8)==> ?”中文” 可以看到进行了两次utf-8编码,一次ISO-8859-1解码,一次utf-8解码。因为ISO-8859-1与utf-8都包含了ASCII字符集(%属于其中之一),所以不会出现乱码。 在使用jQuery中进行ajax操作时,我们只在浏览器端编码一次,然后在服务器端手动解码一次即可,为什么呢? 因为jQuery在ajax操作时,默认进行了一次编码:
为什么中文会乱码?
如何实现更通用的解决方案?
jQuery中的陷阱
function add( key, value ){
s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
};
详细解决方案
Http协议Get步骤传参探究
热度:120 发布时间:2012-10-07 17:28:51.0
相关解决方案
- struts HTTP Status 500解决办法
- httpclient老是提示java.lang.NoSuchMethodError: org.apache.http.protocol.BasicHttpCon
- 启动tomcat后,http://localhost:8080无法打开的有关问题
- 相干tomcat HTTP Status 500的疑问,麻烦大家进来看看
- Web Service 错误:服务器未能识别 HTTP 头 SOAPAction 的值: http://tempuri.org/
- HTTP Status 404 - /jspdemo/Register.jsp,该怎么解决
- 'http://reg.163.com/login.jsp?type=1&url=http://entry.mail.163.com/coremail/fcg/,该如何处理
- org.apache.http.client.HttpClient与org.apache.commons.httpclient.HttpClient的差别
- HTTP 404有关问题
- myeclipse<%@ taglib prefix="c" uri="http://java.sun.com/jst1/core_rt"%>解决思路
- ,http 200状态码
- tomcat新手有关问题 HTTP Status 404 - /manager/
- java http 分段上载
- soap调用webservice,报错:Root element of a SOAP message must be: 'http://schemas.xmls,该怎么处理
- HTTP Status 404如何解决
- org.apache.tomcat.util.http.Parameters processParameters,该怎么解决
- 新手,HTTP Status 404 有关问题
- java http 断点上传,该如何处理
- JSP疑问<%@ taglib prefix="ht" uri="http://www.ht.com.cn/jsp/taglibs"%>该怎么处理
- weservice调用Server returned HTTP response code: 500 for URL解决方法
- HTTP Status 404 - /webproject2/servlet/login解决办法
- 报错:HTTP Status 405 - HTTP method GET is not supported by this URL解决思路
- http://newbbs.csdn.net/ 现时和老版的bbs用的还不是同一个库
- http://newbbs.csdn.net/ 现下和老版的bbs用的还不是同一个库
- Java.io.IOException: error 3 during http over WSP 这个是什么东东
- http://sourceforge.net这个网站是什么啊解决方案
- http 传送数据 每个包有大小限制码?解决办法
- Server returned HTTP response code: 403 for URL如何解决
- http://www.java-home.com重新下线,诚邀您的加入
- httpClient 错误 The server failed to respond with a valid HTTP response