浏览器正常显示html
response.setContentType("text/html;charset='utf-8'")java
response.setCharacterEncoding("utf-8");web
服务器端正常接收浏览器
中文乱码有三种状况服务器
1)表单提交(get方式,post方式):input表单输入为中文ide
2)超连接(get);连接?参数名=值(中文)工具
3)sendRedict(get) 连接?参数名=值(中文)post
乱码产生的根本缘由编码
请求发送时:浏览器有默认的编码,经上述设置以后,是utf-8。url
web服务器接收时候,也有一种编码,因为服务器通常是国外开发的,所以默认的编码方式通常是iso-8859-1
浏览器与服务器的编码方式不一致,于是产生乱码
问题解决方法
1,若是是表单提交,方法是post(表单提交应当尽可能选择post)
此时经过http请求体传递参数,由于服务器会将对应的http请求头解析并进一步包装为request对象,所以利用request.setCharacterEncoding方法,指定web服务器接受端的编码方式,如request.setCharacterEncoding("utf-8")
2,若是是表单提交,方法是get
此时经过连接传递参数,针对乱码状况,能够利用
String value=new String(request.getParameter("参数名").getBytes("iso-8859-1"),"utf-8")来解决
这种状况能够封装成一个工具类
package com.bobo.utils; import java.io.UnsupportedEncodingException; public class MyTools { public static String getNewString(String str){ try { return new String(str.getBytes("iso-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }
3,超连接乱码,sendRedict的乱码本质上也是get请求,解决方法同2
4,若是是ie6及如下版本,上述方法中涉及到get方法时依然有可能出现乱码,此时的解决方法是:
对要发送的中文进行编码
String info=java.net.URLEncoder.encode("你好","utf-8");
response.sendRedict("url路径?参数名="+info);
第三个文件接收
String info=new String(request.getParameter("参数名").getBytes("iso-8859-1"),"utf-8");
补充关于乱码的相关知识点:
1、当咱们下载文件的时候,可能提示框是中文乱码,此时的解决方法是:
String temp=java.net.URLEncoding.encode("中文文件名","utf-8")
response.setHeader("Content-Disposition","attachment;filename="+temp);
2、request.getRequestDispatcher()以后出现乱码
对于某一个页面,在单独访问的时候是正常的,但是讲过上述语句转向以后出现乱码
在Servlet中,通常有参数传递的话,会设置页面接收参数和传递参数的编码。即下面两句:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("utf-8");
通常状况下,大部分都会想到使用这个,可是这两句代码的位置有时却容易被忽视,我今天就是忽视了这两句的位置。正确的写法是,request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("utf-8");要放在PrintWriter out = response.getWriter();的后面。由于out对象初始化以后,再设置编码已经没有任何意义了!因此必须在out对象初始化以前进行编码的设置。