关于中文乱码问题

Request:请求 :获得从浏览器发送过来数据.
Response:响应:向浏览器输出数据.

1.Response输出中文乱码问题:
输出中文:
使用字节流输出中文:response.getOutputStream()
下面写的这句代码会不会有乱码问题:
不一定:
浏览器的默认打开的时候编码有关.
request.getOutputStream().write(“中文”.getBytes());
如果字节流输出中文不会有乱码:
1.设置浏览器的默认打开方式的编码:
response.setHeader(“ContentType”,”text/html;charset=UTF-8”);
2.设置中文转成字节数组的时候的编码:
response.getOutputStream().write(“中文”.getBytes(“UTF-8”));
使用字符流输出中文:response.getWriter();
下面写的这句代码会不会乱码:
一定会乱码
response.getWriter().write(“中文”);
一定会乱码?字符流都有缓冲区.缓冲区默认的编码:ISO-8859-1.
1.设置字符流缓冲区编码.
response.setCharacterEncoding(“UTF-8”);
2.设置浏览器的默认打开方式的编码.
response.setHeader(“ContentType”,”text/html;charset=UTF-8”);
***** 合二为一:简写response.setContentType(“text/html;charset=UTF-8”);
2.Request接收中文的乱码问题:
GET
1.先编码再解码.URLEncoder、URLDecoder.
2.修改Tomcat默认的字符集.
3.使用String类的构造方法.
String username = request.getParameter(“username”);
new String(username.getBytes(“ISO-8859-1”),”UTF-8”);
POST
request缓冲区默认的码表:ISO-8859-1
解决:
request.setCharacterEncoding(“UTF-8”);

关于解决提交中文乱码问题
现象:servlet得到请求参数时,中文可能乱码
解决办法:每次请求都先经过过滤器,过滤器重新封装HttpServletRequest对象,增强其中的getParameter()方法,然后放行,在servlet中取参数时,就能够调用增强过的getParameter()得到中文了。这样,get和post请求方式的乱码问题就能解决。

servlet类
public class ServletDemo6 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// GET请求
		String name = request.getParameter("name");
		System.out.println(name);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// POST请求
		String name = request.getParameter("name");
		System.out.println(name);
	}
}
封装类
public class MyRequest extends HttpServletRequestWrapper {
	//HttpServletRequestWrapper是HttpServletRequest的实现类
<span style="white-space:pre">	</span>private HttpServletRequest request;

	public MyRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	@Override
	public String getParameter(String name) {
		// 增强.解决中文乱码.
		// Post和Get请求的方式解决乱码不一样的.
		<span style="color:#ff0000;">// POST解决:request.setCharacterEncoding();
		// GET解决: new String(name.getBytes("ISO-8859-1"),"UTF-8");这种3中方法中最简单的一种</span>
		// 获得请求方式. 如何获得请求方式:request.getMethod();
		// 获得请求方式:
		String method = request.getMethod();
		if ("GET".equalsIgnoreCase(method)) {
			// 接收过来.
			String value = super.getParameter(name);
			// 进行乱码处理
			try {
				value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			return value;
		} else if ("POST".equalsIgnoreCase(method)) {
			try {
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return super.getParameter(name);
	}
}

过滤器类
public class GenericEncodingFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 强转成子类对象.
		HttpServletRequest req = (HttpServletRequest) request;
		// 包装req对象.
		MyRequest myReq = new MyRequest(req);
		// 放行.
		chain.doFilter(myReq, response);
	}

	public void destroy() {}
}

配置文件
<!-- 案例六:通用的字符集编码过滤器-->
	<filter>
		<filter-name>GenericEncodingFilter</filter-name>
		<filter-class>cn.itcast.filter.demo6.GenericEncodingFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>GenericEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值