用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
相关解决方案
- HTTP Status 404 - /jspdemo/Register.jsp,该怎么解决
- org.apache.http.client.HttpClient与org.apache.commons.httpclient.HttpClient的差别
- ,http 200状态码
- tomcat新手有关问题 HTTP Status 404 - /manager/
- http 传送数据 每个包有大小限制码?解决办法
- 急关于Windows Server 2008 的 iis 7 下的aspx页面“HTTP 异常 404.3 - Not Found”异常
- HTTP 异常 405.0 - Method Not Allowed
- HTTP 异常 401.3 - 未经授权:访问由于 ACL 对所请求资源的设置被拒绝
- HTTP 异常 400 - Bad Request怎么解决
- HTTP 405异常
- iis HTTP/1.1 新建应用程序失败,父路径等基本设置都已更改,但还是不能访问解决方案
- Uploadify http error 500解决思路
- HTTP modules are called as part of the ASP.NET request pipeline and have access to life cycle events throughout the request.解决办法
- []http 500有关问题
- win2003企业版,安装之后运行ASP文件出现:HTTP 异常 404 - 文件或目录未找到
- 关于新建ASP.NET项目的简单有关问题(HTTP/1.1 403 Access Forbidden)
- []小弟我上传的网站出现 HTTP 异常 403 - 禁止访问 ,咋回事啊
- HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。该如何解决
- http Get 二次联接失败
- http 怎么获取重定向后的地址
- http Get 二次连接失败,该如何处理
- 关键字:MTK,DNS,HTTP,WAP,SOCKET,求高人点拨!该怎么处理
- 关于ibm http server6.1,该如何处理
- HTTP/1.1 503 服务不可用,没法收发邮件
- Tivoli Tam http-header 认证模式求教
- Tivoli Tam http-header 认证方式求教!该怎么解决
- HTTP 异常 500.100 - 内部服务器异常 - ASP 异常
- iis7 http error 500.0,该怎么解决
- 自定义后缀名找不到文件 HTTP 异常 404
- [求教]HTTP 异常 404.0