一:
在后台拿到值后对值进行重新编码,比如向后台传递的参数title是中文
在后台接收此参数:
String title=request.getParameter("title");
转码:
String titlenew=new String(title.trim().getBytes("ISO-8859-1"), "UTF-8");
二:
javascript的urlencode()函数可把字符串作为 URI 进行编码(不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) ),把非英文字符转化为英文编码
urlschool = appPath+"/recruit/recruit_viewInfoList.do?page="+page+"&rows=8&abstr=0"+"&categoryId=40941992905003505418"+"&title="+positionschool;
$.getJSON(encodeURI(urlschool),function(data){
//
}
后台再用java.net.URLDecoder.decode()函数进行解码
conferenceSign.setParticipants_name(java.net.URLDecoder.decode(title,"UTF-8"));
但是以上两中方法,每次都要进行重新编码,解码,会很麻烦,下面介绍第三种方法
三:
使用拦截器(拦截器的原理不做过多赘述),代码如下:
public class SetCharactorEncoding implements Filter{
String encoding=null;
@Override
public void destroy() {
encoding=null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding!=null){ //判断字符编码是否为空
request.setCharacterEncoding(encoding); //设置request的编码格式
response.setContentType("text/html;charset="+encoding); //设置response的字符编码
HttpServletRequest req = (HttpServletRequest)request;
chain.doFilter(req, response); //传递给下一个过滤器
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding=filterConfig.getInitParameter("encoding"); //获取初始化参数
}
也许很多盆友觉得这就万事大捷了,no,no,no.
有心的盆友可能会发现,如果是get方式提交请求,拦截器会不起作用,为什呢?因为post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value¶me2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,所以上面的拦截器还需要强化一下。
public class SetCharactorEncoding implements Filter{
String encoding=null;
@Override
public void destroy() {
encoding=null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding!=null){ //判断字符编码是否为空
request.setCharacterEncoding(encoding); //设置request的编码格式
response.setContentType("text/html;charset="+encoding); //设置response的字符编码
HttpServletRequest req = (HttpServletRequest)request;
if(req.getMethod().equalsIgnoreCase("get")){ //如果是get请求还要进一步过滤
req=new GetHttpServletRequestWrapper(req,encoding);
}
chain.doFilter(req, response); //传递给下一个过滤器
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding=filterConfig.getInitParameter("encoding"); //获取初始化参数
}
我们对请求类型做一个判断,如果是get请求,我们需要通过重写httpServletRequest包装接口HttpServletRequestWrapper ,来修改url中的参数
public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String charset = "UTF-8"; //初始化charset
public GetHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
public GetHttpServletRequestWrapper(HttpServletRequest request,String charset) {
super(request);
this.charset = charset;
}
/**
* 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
*/
public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}
public String convert(String target) {
System.out.println("编码转换之前:" + target);
try {
return new String(target.trim().getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
return target;
}
}
这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!