控制台和页面传输乱码问题
在我们的web开发中避免不了遇到乱码问题
今天解决我遇到的乱码问题。
1、产生乱码的原因
Java语言内部是用UNICODE表示字符的,遵守UNICODE V2.0。Java程序无论是以字符流读/写磁盘文件,还是向URL转接写HTML信息,或从URL连接读取参数值,都会由UNICODE作为中介和本地字符编码进行转换。
在WEB应用中,浏览器、WEB服务器、WEB应用程序和数据库等各个部分都有可能使用不用的字符集,字符在不同的字符集之间进行转换时,就有可能出现乱码问题。
2、解决控制台乱码
1、打开intelliidea安装路径bin目录下,找到这两个文件,并在最后一行添加
-Dfile.encoding=utf-8
2、在idea 的setting中设置File Encondeing ,将选中的都设置为 UTF-8
3、在Tomcat的VM options 添加 -Dfile.encoding=utf-8
4、Help->Edit Custom VM OPtions中加 -Dfile.encoding=utf-8 重启idea
把这四个地方都检查一下,最后重启一下idea。到这里基本上已经能解决控制台中文乱码的问题了!
如果还有乱码,那可能是当前的项目的encoding.xml做了对其他编码的缓存,我们要删除除了UTF-8以外的缓存。再重启idea差不多就行了。
3、页面数据传输的中文乱码
在我学SpringMVC的时候遇到的问题,在提交表单数据的时候,传输到后端就产生乱码,尤其是在post请求的时候,那么这个时候我们通常会选着用 过滤器 来解决。
- SpringMVC给我们写好了过滤器,我们只需要在web.xml中配置它就行。
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 如果这个过滤器解决不了,我们就用一个自定义的更强大的过滤器,这个过滤器是网上大神写的。摘取过来。但是找不到原出处了
package com.kuang.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* 解决get和post请求 全部乱码的过滤器
*/
public class GenericEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//处理response的字符编码
HttpServletResponse myResponse=(HttpServletResponse) response;
myResponse.setContentType("text/html;charset=UTF-8");
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
//取一个值
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
//取所有值
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}
最后记得在web.xml中注册这个过滤器噢!
以后遇到的乱码的问题再陆续补充。乱码可遇不可求。😄