问题1:关于response设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文
解决方法:response.setContentType("text/html;charset=UTF-8");
问题2:关于页面提交请求参数(request)出现的中文乱码的问题
解决方法:
way1:
如果表单是用get提交方式,则需要在servlet中添加如下语句:
request.setCharacterEncoding("UTF-8");
如果表单使用post方式提交,则需要在servlet中添加如下语句:
eg:以username为例:
String username = request.getParameter("username");//此时username为乱码状态
username = new String(username.getBytes("ISo-8859-1"),"UTF-8"); //此时username正常显示中文了
原理:
way2:通过filter进行request.getParameter(name);的方法增强
核心代码如下图所示:
way3:通过代理对象将方法进行强化
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
/**
* 使用动态代理完成乱码问题
*/
HttpServletRequest proxyInstance = (HttpServletRequest) Proxy.newProxyInstance(
req.getClass().getClassLoader(),
req.getClass().getInterface(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("getParameter".equals(method.getName())){
String invoke = (String) method.invoke(req, args);//乱码
invoke = new String(invoke.getBytes("ISO-8859-1"), "UTF-8");
return invoke;
}
return method.invoke(req, args);
}
});
chain.doFilter(proxyInstance, resp);
}
问题3:cookie不能保存中文。那么如何将cookie中的中文进行保存?
解决方法:在将中文字符username保存到cookie中,首先将username进行编码,URLEncoder.encode(username, "UTF-8");此时得到的是一串字符串,记为cookie_username,保存到cookie中。然后,我们从cookie中取到cookie_name这串乱码,对它进行解析,URLDecoder.decode(cookie_name, "UTF-8");此时得到的就是一串中文字符。
问题4: