中文乱码出现的原因是由于原因主要有两个:一个是字符转储传输过程中编码不一致导致的,一个是编码本就不支持中文。
支持中文的编码有(国标GB):GBK,GB2312,GBK18030,和UTF-8。(个人更喜欢使用UTF-8)
javaWeb中乱码情况主要分三种情况:
一、jsp页面显示中文乱码。保存中文字符 重新打开乱码。
二、客户端发送数据到服务器,服务器接收出现乱码。客户端发送数据又分为使用get请求和post请求两种。
三、服务器发送数据到客户端,客户端显示出现乱码的情况。
解决办法:
一、(1)jsp页面显示中文乱码。
//页面开始添加
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
//head中添加
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
*pageEncoding用于设置JSP页面本身的编码
(2)文件保存中文字符 重新打开乱码。
如果是myeclipse(其他IDE类似)
Windows -> preference -> general -> Content Types ->Text 选择你需要显示中文的文件类型,将文件保存的默认编码设置为UTF-8。
二、客户端发送数据到服务器,服务器接收出现乱码。客户端发送数据又分为使用get请求和post请求两种。
(1)get请求使用URL传参,浏览器对于请求的字符串一般使用utf-8。但是发送到服务器端,tomcat默认使用ISO-8859-1来解码,于是接收的时候乱码就产生了。
解决办法有两个:一、在服务器接收的时候手动解码,在doGet()方法中。
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
URIEncoding="UTF-8"。
<Connector part="8080" protocal="HTTP/1.1"
connectionTimeout="8000" redirectPort"8443" URIEncoding="UTF-8"/>
(2)post请求乱码
解决办法也是两个:一、和get方法一样手动解码
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
二、在doPost方法里面设置全局编码,在第一行添加
request.setCharactorEncoding("UTF-8")
(3)对于两种请求,单独解码或者配置都比较麻烦。我们可以采用在web.xml添加过滤器的方式
使用过滤器要在web.xml中添加过滤器,如果你有使用到struts2或者spring框架,他们提供了这样的一个过滤器类,你只需要添加到配置文件就可以使用。如果都没有用到可以自定义过滤器类,后面有提到。
如果使用到spring框架:在web.xml中添加
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果使用了struts2框架:在web.xml中添加
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
两者二选其一就行。如果没有使用框架,则需要自己实现过滤器类。
例如我的包名:com.example.user。在user文件夹下面建一个MyFilter类:
public class MyFilter implements Filter {
private String character; // 字符集编码类型
/**
* Filter的初始化
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
character = filterConfig.getInitParameter("character");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
// 读取初始化的参数character
servletRequest.setCharacterEncoding(character);
servletResponse.setCharacterEncoding(character);
servletResponse.setContentType("text/html; charset=UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
再在web.xml中将刚刚自定义的过滤器类添加进来:
<filter>
<!-- Filter的名字 -->
<filter-name>MyFilter</filter-name>
<!-- Filter的实现类 -->
<filter-class>com.example.user.MyFilter</filter-class>
<!-- 初始化参数 -->
<init-param>
<param-name>characterEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 定义Filter要拦截的url地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name> MyFilter </filter-name>
<!-- 要拦截的url,这里是所有拦截 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
三、服务器发送数据到前端显示乱码
输出前设置内容编码格式
response.SetCharceterEncoding("utf-8");
response.getWriter().write("张三");