时间:2023-06-29 07:24:01 | 来源:网站运营
时间:2023-06-29 07:24:01 来源:网站运营
透彻分析和解决一切javaWeb项目乱码问题:get请求get请求,请求参数中带有中文,后台接收会出现乱码,原因是tomcat默认编码是“ISO-8859-1”,所以tomcat会使用“ISO-8859-1”对中文进行编码,该编码不支持中文,所以后台接收到就乱码了。解决方式有两种。
post请求post请求,出现乱码的原因同get请求,解决方式比较简单,如下:
request.setCharacterEncoding("utf-8");
设置请求参数的编码格式为“utf-8”,这样就不会有问题了。两者区别以及使用规则
response.getOutputStream().print()返回英文数据就不说了,没什么问题,看下返回中文是什么效果;
@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.getOutputStream().print(str);}
结果如下:response.getOutputStream.write()同样的,我们再来看下输出中文会怎么样。
@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.getOutputStream().write(str.getBytes());}
页面输出结果如下:涓浗鍔犳补锛屾姹夊姞娌�
分析:@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.getOutputStream().write(str.getBytes());}
页面输出:中国加油,杭州加油
原理我们弄清楚了,但是在项目开发中,我们需要编码统一,最常用的就是中文字符编码"UTF-8",可是按照我们的理解,如果我们直接response.getOutputStream().write(str.getBytes("utf-8"));肯定会乱码,我们需要用某种方式,告诉浏览器,你要用我指定的“utf-8”编码接受我返回的中文。response.setContentType("text/html;charset=UTF-8")这样就完事了,看看效果吧。@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.setContentType("text/html;charset=utf-8"); response.getOutputStream().write(str.getBytes("utf-8"));}
页面输出:中国加油,杭州加油
response.getWriter()前面已经总结过了,response.getWriter()跟response.getOutputStream()不一样,outputStream是输出二进制的,writer是输出字符串的。response.getWriter()输出也有两种方法,一种是print(),一种是write(),其实两者在处理乱码这一块没有什么区别,就不分开讲述了。
@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.getWriter().print(str);}
页面输出:?????????
分析:@RequestMapping("/helloworld.do")public void helloworld(HttpServletRequest request, HttpServletResponse response) throws IOException { String str = "中国加油,杭州加油"; response.setContentType("text/html;charset=utf-8"); response.getWriter().print(str);}
页面输出:中国加油,杭州加油
在这里,response.setContentType("text/html;charset=UTF-8")做了两件事,response.setCharacterEncoding("UTF-8");和response.setHeader("Content-Type", "text/html;charset=UTF-8");具体就是,第一,输出中文”中国加油,杭州加油“的时候,对中文进行”utf-8“编码;第二,告诉浏览器,你也要用"utf-8"来显示我返回的中文。<filter> <filter-name>encodingFilter</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> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这样能保证请求的参数按照指定的编码格式进行编码,简单翻看下过滤器源码如下:@Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); }
代码中有两处重要的地方值得注意,分别是request.setCharacterEncoding(this.encoding);和response.setCharacterEncoding(this.encoding);前者表示我们对请求过来的参数使用指定的"utf-8"进行编码,后者便是,返回给浏览器时,后端返回字符的编码是“utf-8”。关键词:项目,分析,和解,透彻