首先看一段乱码的程序:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username=request.getParameter("username");
String password=request.getParameter("userPwd");
System.out.println("处理之前:"+username+":"+password);
//此时输出的结果:处理之前:è¡çå:aa1234bb---也就是说中文字符本身的编码还是不对。
username = new String(username.getBytes("ISO8859-1"),"UTF-8");
System.out.println("处理之后:"+username+":"+password);
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream out=response.getOutputStream();
out.println(username);
out.println(password);
get请求的原理图:
1.数据解析编码:指的是html页面form表当数据提交时候的编码方式,这个编码方式和页面编码是统一的,这里设置为UTF-8
2.GET请求的的请求数据,并不在请求体体中,而是在请求行中的?之后。而整个请求数据,包括请求行,请求头,请求体都会通过http协议发送到服务端去处理。(HTTP协议时不支持中文的,默认编码:ISO8859-1)
对比post请求,post请求的的请求数据都包含在请求体中,当发送了了服务端的时候,通过设置request.setCharacterEncoding("UTF-8"),就能够使得数据传输到服务端的时候,能够将其解析成utf-8的数据。
但是,这样的设置编码的操作对请求行中的数据缺失无效的。
3.前面说了数据时通过http协议的方式发送到服务端,而请求行的信息(原始状态下是UTF-8编码)经过http协议进行传输的时候,http协议对其进行了默认编码的编码操作。并发送到了服务端,而服务端类似post请求的处理方式,对其有没有作用。那么,服务段应该如何对这样的乱码,就行解码,让其还原成UTF-8编码呢。实际上就是还原成原始数据的编码?
(乱码产生的核心本质:源编码和读取显示的编码不一致)
思路:找到源编码的二进制,然后重新用UTF-8进行解码就可以了。
服务端:String username=request.getParamter("username");----这是获得的ISO8859-1编码的乱码数据
username.getBytes("ISO8859-1");-----这样就获得了原始数据。
而原始数据就是按照UTF-8编码的,那么此时,只需要将其变成UTF-8的字符串数据就ok
new String(username.getBytes("ISO8859-1,"UTF-8""));
最终表现在上面的程序中,值处理之前,是乱码的,通过解码在还原的操作,中文则不再乱码。
仍然存在的疑惑:
1. response.setContentType("text/html;charset=UTF-8");
如果没有手动解码的代码username.getBytes("ISO8859-1"); 通过上述方式设置response编码,将其发送到浏览器,没有出现乱码。
这种情形是合理的吗?是不是上述操作的底层也是用过来类似 username.getBytes("ISO8859-1") 这样的解码方式?(可以这么理解)
2.如果是post请求的时候,请求内容在请求体中,不也要通过http协议对其进行编码吗?为什么数据发送到服务端,就直接可以通过
request.setCharcterEncoding(UTF-8)对数据进行解码?(视频里面提到流的处理方式)
这里面,request.setCharacterEncoding(UTF-8)值能请求体中的流进行处理。
那么这个还有一个问题就是,
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream out=response.getOutputStream();
out.println(username);
out.println(password);
做了这样的操作以后,即使没有手动解码,在服务端通过上述流操作,将数据输出到浏览器中,没有出现乱码。
那么对于get请求,手动解码的意义是什么呢。后来明白了,因为大多数情况下,还是要将数据信息存储到数据库中个,
存储到数据库的操作,可不是流的操作, 那么这个时候,如果这届存储到数据库的情况下,就会乱码的。所以通过手动解码的方式的意义还是大大的。
当然,一般不用字节流来处理文本数据,上述代码,改成response.getWriter的方式处理就ok。
相关推荐
使用过滤器实现GET请求和POST请求的中文乱码问题,只需在自己的Web应用中的web.xml中配置该filter即可使用。
get请求乱码问题 java
get post 请求中文乱码 处理方式一(小实例+说明文档)
参看文档:http://blog.csdn.net/sinat_29398599/article/details/52880036
https://blog.csdn.net/myWorld001/article/details/109261850
过滤器实现get请求乱码问题 过滤器实现get请求乱码问题 过滤器实现get请求乱码问题
IE 浏览器在get请求下中文乱码的问题
JSP中 ajax的get请求的中文乱码问题的解决方法.pdf 学习资料 复习资料 教学资源
SpringMVC解决GET请求时中文乱码的问题.rar
filter是javaWeb中一个十分重要的知识点,可以拦截webApp的所有请求。 使用场景: 1、可以利用filter做到网站自登录。...2、可以利用filter全局修改参数编码,从而解决中文乱码问题(十分重要)。
C++Http上传文件到web服务器,解决中文参数乱码问题,微软提供的Chttpconnect 类在请求http头参数是中文时出现乱码
主要介绍了Java Http请求传json数据乱码问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java解决解决get中文乱码问题,在项目中多次使用,从未有错!
03.SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢
支持jmeter5.0 请求参数中文乱码,修改了jar源代码,直接放到lib/ext 覆盖即可
可以解决post get请求乱码问题.
解决Jmeter5.3上传文件中文乱码问题和录制脚本中文乱码问题,替换原本的lib\ext目录下的ApacheJMeter_http.jar文件,上传文件时,需要勾选“对POST使用multipart / form-data” 和 “与浏览器兼容的头”选项,并在...
Java中解决POST和GET请求的中文乱码问题.doc
下面小编就为大家带来一篇完美解决Get和Post请求中文乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
直接拷到项目就可以用,跨服务器请求,并处理返回结果中的中文