浏览器到服务器乱码:
- 解决方案:
1):设置请求头:request.setCharacterEncoding("utf-8");
意义:
告诉服务器,本次请求的请求实体里面的内容用utf-8字符集解码(根据本地服
务器里面的servlet在编写的时候使用编码集)
注意:
本次设置只针对请求实体,故而使用get传参方式,参数包裹在请求行中,无法
被本次设置覆盖,取出的参数依然是乱码。
解决办法:
1)在服务器的conf目录下servlet.xml文件中设置服务器参数中,
其中有一个Connector标签,在这个标签中设置属性:
useBodyEncodingForURI="true":表示请求实体中的解码标
准适用于uri(即请求行中的解码字符集同请求实体)
2)同在servlet.xml文件中的Connector标签中设置属性:
URIEncoding="utf-8":表示设置uri的编码字符集为
“utf-8”标准
注意:服务器解析request请求会在第一次操作的时候就将里面的参数以某一编码集为标准全部解析出来,
造成的结果就是:
在第一次读取参数以后设置请求编码,该设置无效,之后如果取到中文发现乱码之后再
设置编码集,取到的依然是乱码
2.服务器到浏览器的乱码:
解决方案:
1)设置响应头:response.setHeader("content-type","text/html;charset=utf-8");
意义:告诉浏览器:本次响应解码使用的编码集为:utf-8;
本方法最靠谱
2)设置响应编码集:response.setCharacterEncoding("utf-8");
意义:告诉服务器:在本次响应输出的时候使用utf-8编码集。
使用环境:
1)ajax:因为ajax返回的结果方法使用的是
response.getWriter().write()方法,输出的是字符串,
使用jsp页面接收的话,jsp使用的是自身的编码集(根据设置utf-8
或者iso-8850-1)来解码,此处如果不显式地声明response的输出
格式,就收到的就是乱码。
我也不知道默认的输出使用的编码集,因为如果默认的是服务器编码
集的话,应该就是utf-8,那么不设置应该也不会乱码才对。
2)直接往浏览器输出内容:使用的也是response.getWriter().write()
方法,此时应该设置为
response.setCharacterEncoding("gb2312");
gb2312是浏览器默认的接收字符串的编码集;
使用过滤器设置编码集:
package com.cdsxt.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//将ServletRequest request, ServletResponse response强转为HttpServletRequest,HttpServletResponse
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
req.setCharacterEncoding("utf-8");
resp.setHeader("content-type", "text/html;charset=utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
设置下载文件名时中文乱码:
//先将文件名按照服务器编码(我的是utf-8)解码,在通过new String()编码按照浏览器的编码iso-8859-1
String fileName = new String(new String("住户信息表.xls").getBytes("utf-8"),"iso-8859-1");
//设置下载头
response.setHeader("content-disposition", "attachment;filename="+fileName);