`

HTMLPOST和GET编码问题(深入篇)

阅读更多
浏览器 IE/FireFox -------——---->Servlet容器--------——---------------->显示页面

编码        使用容器的URIEncoding解码/request解码,再编码发出响应             解码

一、请求
我把用户发送请求方式不同引起的中文问题划分了四种类型:

1、表单的get提交

2、表单的post提交

3、页面链接传递中文参数(参考get提交)

4、地址栏中参数直接输入中文提交(不讨论,违背寻常规则,而且这种方式很难控制)

1.get提交
对于这种,影响的有tomcat的URIEncoding。
浏览器会根据自己的页面的编码格式作为起始编码格式(右击菜单编码有显示的),把字符使用浏览器的编码格式编码成byte字节进行传输。到了tomcat这里,tomcat会使用URIEncoding进行重新编码(解码),如果tomcat没有配置的话就会使用iso-8859-1对byte进行重新编码(解码)成字符。如果浏览器得编码格式为UTF-8,且tomcat没有配置重新编码(解码)格式的话,就可以使用下面的方式拿到正确的字符了new String(request.getParameter("text").getBytes("iso-8859-1"),"utf-8") 上的意思就是说,把刚才的字符,用iso-8859-1进行编码成byte,还原回去,再使用uft-8对byte进行重新编码(解码)成字符。(这个方法就是刚才从浏览器到tomcat过来的逆向过程)

2.post提交
对于这种情况,response.setCharacterEncoding有影响,当没有对response.setCharacterEncoding设置的时候值为null,则默认采用iso-8859-1来进行重新编码(解码)。
浏览器根据自己页面的编码格式作为起始编码格式,把字符进行编码成byte进行传输,到了tomcat,tomcat不进行干涉其中的重新编码(解码)格式。如果response.getCharacterEncoding为null,那么默认采用iso-8859-1进行重新编码(解码)成字符,如果设置了,就按照设置的编码格式进行重新编码(解码)字符。

jsp:pageEncoding="GB18030"  jsp页面的编码格式,即jsp会被解析成servlet时,采用的编码格式。如果不配置,默认采用iso-8859-1,当jsp文件保存编码类型和pageEncoding不一致时就会出现jsp内部解析乱码。Eclipse现在默认pageEncoding就是文件的编码格式,修改pageEncoding就会修改文件的编码格式。该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时指定对服务器响应进行重新编码(解码)的编码,从而pageEncoding会影响浏览器的编码格式。

jsp:contentType="text/html;charset=UTF-8"  的作用是指定对服务器响应进行重新编码(解码)的编码。设定浏览器的编码格式。也就是说浏览器提交数据就会使用这个编码格式。相当于response.setCharacterEncoding来改变编码,但是改变的只是jsp请求的response编码格式。不能改变里面所有其他的ajax请求的编码格式。在没有设定的情况下默认采用ISO-8859-1格式。

meta中
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
当前面pageEncoding和contentType都没有设置的情况下,被解析成的html页面就会采用这种编码方式。来把byte解析成浏览器显示的信息。

jsp页面中 pageEncoding--->contentType--->meta 默认缺省。pageEncoding写了后面的都可以不用写,默认继承。

jsp页面中的设定编码优先级response.setCharacterEncoding--->contentType--->pageEncoding  层层覆盖。

request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码(解码)的编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。对post方法有效。

使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码(解码)的编码。

tomcat:默认URIEncoding为iso-8859-1,可以设置。设置之后,会影响get方法和页面链接传递中文的参数字符编码。

关于UTF-8和GBK转化之间的问题
当UTF-8转化成GBK,再从GBK转化成UTF-8的时候,偶数汉字可以在UTF-8,GBK两者中互相转换,而奇数个汉字则不能。

关于BIG5
关于其他的转码问题,如果使用的是简体中文的字符,即使编码和解码都是使用BIG5,部分字符仍然无法解析,是乱码。

关于ISO-8859-1
ISO-8859-1是不支持中文的,所以就算中文字符使用ISO-8859-1进行编码,最后再用ISO-8859-1进行重新编码(解码)的话,拿到的字符也不能显示中文。即换言之,ISO-8859-1不能作为把字符变成byte的编码格式使用。

ajax
xmlHttp.responseText的请求的默认编码是UTF-8 。当然可以重新设置,通过在Request Headers中设置Content-Type:application/x-www-form-urlencoded; charset=utf-8。为什么ajax和之前的不同呢?因为ajax不是使用默认的浏览器跳转提交方式,而是使用httprequest提交方式,默认跳转方式会读取浏览器的编码格式,而httprequest不会,所以ajax就会设置自己的默认的编码格式进行提交,即UTF-8.而使用ajax的post方法提交,无需再设定request的重新编码(解码)格式,因为request不再是默认的null,已经修改为UTF-8,所以不用转换直接拿出即可。而对于get方法的话,需要参考tomcat的URIEncoding重新编码(解码)。



二、返回信息
而response如果没有显式设置的话,不管request的编码是什么,response的编码就是ISO-8859-1。

对于response返回的信息如:response.getWriter().println就可以看到这个编码设置的作用了。而对于使用request.setAttribute等传递数据的话,这个编码格式设置了也没用。

当使用response.getWriter().println打印到浏览器时,在没有设置response的时候默认为null,而在服务器端则默认使用iso-8859-1进行编码成byte,等到了浏览器,发现response的信息header中没有相关编码设置,就会去取window系统的编码格式,中文系统默认为GBK/GB2312。所以,打印出来的页面的浏览器编码格式为GB2312。而如果设置了response的编码格式,那么就算到了浏览器,浏览器解析也会按照设置的编码格式重新编码(解码)。

当使用response.getWriter().println打印到本地文件时,即使设置了response,在发出时,采用的是设置的编码格式编码成byte,等到了客户端,客户端会用系统的编码格式重新编码(解码)文件,对于windows默认就是GB2312/GBK,所以最好再response发出时就设置编码的格式为GBK。

至于为什么打印到浏览器,头文件的信息就写入编码格式,而打印到本地文件,头文件中就没有写入编码格式的问题,还没有得到证实。猜测:后端传送到浏览器时,浏览器使用包含重新编码(解码)格式的。而传送文件时,没有使用重新编码(解码)格式的,使用的是操作系统的编码格式存储文件。

如果设置了response.setCharacterEncoding。那么就会按照这个编码格式传送到前端,浏览器并用这种方式重新编码(解码)。也就是说在传送的页面的文本信息head中的content-type已经设置成了response.setCharacterEncoding定义的编码格式,来用作重新编码(解码)。

ajax
ajax使用的是response.responseText来进行获取信息,也就是说,也是需要使用到response的编码格式的。ajax不会再对该编码格式进行任何修改。只是接受而已。
分享到:
评论

相关推荐

    post和get提交乱码处理

    本文将深入探讨如何处理POST和GET提交时的乱码问题,以确保网页显示正常,避免出现中文或者其他非ASCII字符的乱码现象。 首先,我们要理解POST和GET的区别。POST请求通常用于向服务器发送大量数据或修改服务器资源...

    网络请求网络请求网络请求网络请求

    本文将深入探讨“网络请求”这一主题,特别关注POST和GET两种主要的HTTP方法。 首先,我们需要理解HTTP(超文本传输协议)是网络请求的核心。它是互联网上应用最广泛的一种应用层协议,用于从Web服务器传输超文本...

    中文乱码过滤器(包括GET和POST)

    2. 请求参数编码问题:GET和POST请求在传递参数时,如果没有正确设置字符编码,中文字符可能会被错误地编码为字节流,导致接收端解码失败。 3. 页面编码设置错误:网页的编码设置如果不正确,展示的中文字符也可能...

    java乱码综合解决方法(不区分get和post)

    Java中的乱码问题是一个常见的编程挑战,特别是在处理网络请求(如GET和POST)时。本文将深入探讨如何解决这些问题,并且不局限于特定的请求类型。首先,我们需要理解字符编码的基本概念,然后分析Java中可能出现...

    利用ethereal对http封包中的post和get分析

    在HTTP通信中,主要有两种请求方法:GET和POST。本文将详细解析如何使用Ethereal(现在称为Wireshark)这款网络封包分析工具来分析HTTP协议中的GET和POST请求。 1. GET与POST的区别: GET方法用于请求获取资源,其...

    php+Ajax(GET&POST)完美实例

    本文将深入探讨如何使用PHP和Ajax解决GET和POST请求中的中文乱码问题,并结合MySQL数据库实现数据的交互。 首先,PHP是一种服务器端的脚本语言,常用于Web开发,可以生成动态网页内容。在处理中文字符时,我们需要...

    Tomcat PostGet 中文編碼處理方法

    ### Tomcat PostGet 中文編碼處理方法 在Web应用开发过程中,中文字符编码问题一直是个常见的技术难题,尤其是在处理HTTP请求中的POST和GET方法时。对于使用Apache Tomcat服务器的应用程序来说,确保中文字符正确...

    web 编码问题

    "web编码问题"主要涉及到前端和后端之间的数据交换、字符集处理、URL编码、JavaScript编码规范以及跨平台兼容性等方面。以下是对这些关键知识点的详细阐述: 1. **字符集(Character Set)**: 在Web开发中,字符...

    windows平台简单的http_client实现POST-GET方法C语言实现

    在Windows平台上,使用C语言实现HTTP...以上是实现一个简单的Windows平台HTTP客户端所需的关键知识点,无论选择使用libcurl库还是直接使用Winsock API,都需要对HTTP协议有深入理解,才能有效地实现POST和GET请求。

    客户端GET、POST上传数据

    在GET请求中,URL编码(使用`URLEncoder.encode()`)是必要的,确保特殊字符和非ASCII字符能够正确传输。服务器端需要解码这些编码,例如在Java中使用`URLDecoder.decode()`。对于POST请求,数据是以字节流形式发送...

    知识共享-jsp页面中文参数传递get和post方法分析(雷惊风).

    本文将深入探讨在JSP页面中如何正确地通过GET和POST方法传递中文参数,以及在不同场景下应采取的最佳实践。 #### 二、GET方法中文参数传递 **1. 直接在URL中传递中文参数** 直接在URL中包含中文参数,如`...

    SpringMVC解决GET请求时中文乱码的问题.rar

    总结,解决Spring MVC中GET请求中文乱码问题的关键在于确保从客户端到服务器再到客户端的整个链路中,字符编码的一致性和正确设置。通过调整配置、使用注解或自定义拦截器,可以有效地解决这个问题,确保中文数据的...

    Web应用安全:HTTP协议GET和POST的使用区别实验.docx

    ### Web应用安全:HTTP协议GET和POST的使用区别实验 #### 实验背景及目标 本实验旨在通过实际操作深入理解HTTP协议中POST方法的工作机制及其与GET方法的区别。实验将利用Firefox浏览器的Firebug插件以及Wireshark...

    Servlet表单Get和Post方式读取

    在这个"Servlet表单Get和Post方式读取"的主题中,我们将深入探讨如何使用Servlet来接收和处理来自HTML表单的GET和POST请求。 首先,让我们了解GET和POST这两种HTTP方法的基本概念: 1. GET方法:这是HTTP请求中最...

    J2EE以GET和POST方式提交表单的乱码解决(受教了)

    下面我们将深入探讨如何解决J2EE环境下GET和POST方式提交表单时出现的乱码问题。 首先,我们要理解GET和POST的区别。GET方式会将表单数据附加到URL后面,而POST方式则将数据放在请求体中。由于GET方式的限制,它...

    JSP编码以及乱码问题解疑

    本文将深入探讨JSP编程过程中出现的乱码问题,包括原因分析和解决方案。 1. **基本的乱码问题** 当JSP页面显示乱码时,通常是因为页面编码不一致导致的。页面的编码设置应保持一致,确保从文件存储、内容解码到...

    JSP-Servlet中的汉字编码问题-JSP教程

    本文将围绕“JSP-Servlet中的汉字编码问题”这一主题展开讨论,通过对相关知识点的深入剖析,帮助读者理解JSP/Servlet环境中汉字编码可能出现的问题及解决方案。 #### 二、基础知识回顾 1. **字符编码**:字符编码...

    用AJAX的Get和Post调用Servlet的简单示例.doc

    本文将深入探讨如何利用AJAX的GET和POST方法调用Servlet,从而实现数据的异步请求和响应。 #### 二、理解AJAX与Servlet的关系 AJAX是一种前端技术,而Servlet是Java后端处理请求的一种方式。在基于AJAX的Web应用中...

    JSP和Servlet中的几个编码的作用及原理

    本文将深入探讨JSP和Servlet中的几个关键编码设置的作用及原理,帮助开发者更好地理解和解决实际开发中遇到的编码问题。 #### 二、主要编码设置及其作用 ##### 1. `pageEncoding="UTF-8"` - **作用**:`...

    tomcat字符编码总结

    本文将深入探讨Tomcat环境中字符编码的相关知识点,并通过实际案例分析如何有效解决中文乱码问题。 #### 二、Tomcat与字符编码的基本概念 **1. 字符编码简介** - **ASCII**: 最早的字符编码标准,只能表示英文等...

Global site tag (gtag.js) - Google Analytics