GET和POST 编码和乱码

1.  什么是URL编码。

URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服务器上。

2.  URL编码规则。

每对name/value由&分开,每对来自表单的name/value用=分开。如果用户没有输入值的那个name依旧会出现不过就是没有值。

URL编码是在字符ASCII码的十六进制数的前面加上%。例如\(她的十六进制数表示为5c)的URL编码就是%5c。

3.  简单介绍乱码和http请求

其实做web开发乱码问题是经常出现的,有了上面编码的基础之后下面来看看乱码。

1)  乱码问题是web开发过程中经常遇到的问题,主要原因就是URL中使用了非ASCII码造成服务器后台程序解析出现乱码的问题。

2)  URL中最容易出现中文的地方就是在QueryString的参数值还有Servletpath中。

3)  简单用一个图来说明一下http请求的流程:

第一步:浏览器把URL经过编码送给服务器;

第二步:服务器把这些请求解码处理完毕之后将显示的内容进行编码发送给客户端浏览器;

第三步:浏览器按照指定的编码显示网页

4)  详细剖析GET提交如何编码以及服务器如何解码以及乱码解决方案

对于GET方式,我们知道它的提交是将请求数据附加到URL后面作为参数,这样依赖乱码就会很容易出现,因为数据name和value很有可能就是传递的为非ASCII码。

当URL拼接后,浏览器对其进行encode,然后发送到服务器。具体规则见URL编码规则。

这里详细说一下encode的过程中容易出现的问题,在这个过程中我们要明白需要URL encode的字符一般都是非ASCII码字符,所以我们就能知道出现乱码主要是URL中附加了中文或特殊字符做成的,另一个要知道URL encode到底是以什么样的编码方式对字符进行编码的,其实这个编码方式是由浏览器决定的,不同的浏览器和同一浏览器的不同设置影响了URL的编码,所以为了避免我们不需要的编码,我们可以通过java代码或javaspcript代码统一进行控制。

完成了URL encode之后URL就成了ASCII范围内的字符了,然后就以iso-8859-1的编码方式转换为二进制随着请求头一起发送出去。

到了服务器之后,首先服务器会先用iso-8859-1进行解码,服务器获取的数据都是ASCII范围内的请求头字符,其中请求URL里面带有参数数据,如果是中卫或特殊字符,那么encode后的%XY(编码规则中的十六进制数)通过request.setCharacterEncoding()是不管用的。这时候我们就能发现出现乱码的根本原因就是客户端一般是通过用UTF-8或GBK等对数据进行encode的,到了服务器却用iso-8859-1方式decoder显然不行。

这里的解决方式有两种,

一种:是通过String类的getBytes方法进行编码转换,具体java代码是:

new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)

第二种:在服务器xml代码中改配置信息:

如:修改tomcat的配置文件server.xml:

<Connector port="8080"protocol="HTTP/1.1"  maxThreads="150" connectionTimeout="20000"

redirectPort="8443"URIEncoding="客户端编码"/>

5)  详细剖析POST提交如何编码以及服务器如何解码以及乱码解决方案

对于POST方式,表单中的参数值对是通过request包发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。

在服务器端的程序中我们可以通过

Request.setCharacterEncoding()设置编码,然后通过

request.getParameter获得正确的数据。

这里出现乱码可以通过Request.setCharacterEncoding()直接解决。

在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器):

<filter>
<filter-name>charsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

该过滤器要做的其实就是强制为所有请求和响应设置编码格式:

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

原文地址:http://blog.csdn.net/lfsf802/article/details/7232834

时间: 2024-08-02 11:02:11

GET和POST 编码和乱码的相关文章

Java编码与乱码问题

一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8个bit,所以能表示的字符范围是0~255个,这满足不了人类的需要,要解决这个矛盾必须需要一个新的数据结构char,从char到byte必须经过编码. 二.常用编码介绍 ASCII码 总共128个,用一个字节的低7位表示,0~31是控制字符,如换行.回车.删除等,32~126是打印字符,可以通过键盘

JSP/Servlet编码导致乱码问题

JSP/Servlet编码导致乱码问题 jsp页面的三处编码:       1.<%@ page language="java" pageEncoding="UTF-8"%>         作用:告诉jsp编译器将jsp编译成Servlet时使用的字符编码         例如,你的JSP文件是以GBK为编码保存的 (右击jsp-->Properties --> Text file encoding                设置成与p

Microsoft excel 打开utf-8编码csv乱码问题

<?php /* 其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了. 这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流

java获取常见文本文件的编码 解决乱码问题

乱码问题的产生一般是,由字节流转字符流的时候,读文件的编码与文件的系统编码不一致造成的. 解决方式:先自动判断文件系统编码类型,然后读的时候用这个类型去读就ok了. 自动判断文件系统编码类型代码如下, 地址:http://www.cnblogs.com/java0721/archive/2012/07/21/2602963.html java获取常见文本文件的编码 解决乱码问题

HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

原文地址:HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码 HttpServletResponse  和 ServletResponse  都是接口 具体的类型对象是由Servlet容器传递过来 ServletResponse对象的功能分为以下四种: ?        设置响应头信息: ?        发送状态码: ?        设置响应正文: ?        重定向: 设置响应头

编码与乱码

乱码的根源 源编码与目标编码的不一致. 而中文window系统默认编码GBK,害惨了多少程序员. 要尽量减少出现乱码,我个人认为要做到5码合一, IDE(Eclipse/idea),页面(jsp/其他模板引擎),应用服务器(tomcat等), 源码(Java源码及周边文件),数据库编码. 将Eclipse设置为UTF-8 打开Eclipse安装目录下的eclipse.ini,在最末尾新增一行 -Dfile.encoding=UTF-8 修改之后的,重启eclipse即可. JSP页面编码 <%@

JAVA IO ( 编码_乱码_解码 )

public class Index { public static void main(String[] args) { String s = "黄伟强"; try { // 编码(编码方式 GBK:国标 UTF-8:国际通用 ISO-8859-1:美洲 默认为当前项目的编码) byte[] b = s.getBytes("UTF-8"); System.out.println(Arrays.toString(b)); // 乱码的解码方式(编码和解码使用不同的字

Eclipse修改编码后乱码解决

Eclipse用了一段时间,都是用的gbk编码的,突然想要规范下,强迫症犯了,于是将在Window->Preference->Appearances->Workspace修改Text file encoding为UFT-8,一点击确认,Oh,My God!中文都乱码了,一开始想的是用记事本将文件一个一个的另存为UTF-8格式,累死了,发现工程量太大,放弃了,转战代码,下面是可实现的代码,支持批量处理(即处理一个文件夹内的所有代码),不支持文件夹下还有文件夹的情况!代码如下: packag

Android Studio中编码(乱码)问题的解决方案

在Android Studio中,无论是自己新建的项目,还是import的项目,亦或是从网络返回的数据,只要其中涉及中文,极有可能会出现乱码问题,导致在手机界面上显示达不到预期的效果.如下所示: . 解决方案如下: (1)打开FIle-->Settings-->Editor-->File Encodings,会出现以下界面: . 一般只要设置上方的IDE Encoding和Project Encoding.前者指IDE的编码方式,后者指你的Project的编码.一般都可以设置为UTF-8