中文乱码产生的情况 JSP页面中文乱码 我们新建一个JSP文件可以在四个地方法设置相关的编码。 在eclipse中点击jsp文件,右键-properties-Resource设置jsp文件的字符集编码。这个很好理解,就
中文乱码产生的情况
JSP页面中文乱码
我们新建一个JSP文件可以在四个地方法设置相关的编码。- 在eclipse中点击jsp文件,右键->properties->Resource设置jsp文件的字符集编码。这个很好理解,就是设置jsp文件在eclipse中显示的字符集编码。
- jsp文件中jsp page标签pageEncoding属性。jsp文件会最终会转换成Servlet文件(也就是java文件),pageEncoding属性设置jsp转换到Servert的编码格式。
- jsp文件中jsp page标签contentType属性。设置返回给浏览器的jsp文件采取了什么样的字符集编码,浏览器知道jsp文件的编码方法才能正确的解码。
- html中head元素中
<!-- HTML4.01中规定设置HTML文档字符集编码方法方式 --> <meta http-equiv="Content-Type" content=text/html; charset=UTF-8">或
<!-- HTML5中规定设置HTML文档字符集编码方法方式 --> <meta charset="UTF-8">这两种方式作用同jsp page标签contentType属性,只不过同时出现在jsp文件中,contentType优先级会高于和两种方式。
jsp页面在浏览器上中文乱码通常都是这四个地方没有设置好字符集编码引起的。通常这四个地方的字符集编码设置都是一样的。例如:文件编码格式为GBK,那么其它三个地方字符集都应该设置为GBK。确保在jsp文件编辑环节、java转换成Servlet环节、服务器发送给浏览器jsp文件环节都能得到正确的字符集编码以便正确的解码。
get请求发送参数乱码
这种情况有三种解决方法:第一种方法:
在Tomcat目录下找到conf\server.xml文件,在Connector节点添加URIEncoding="UTF-8"属性,告诉tomcat浏览器地址栏URL的编码方式为UTF-8。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />第二种方法:
显示解码,代码如下:
<!-- tomcat对get请求的地址栏参数默认使用ISO-8859-1编码 --> <!-- 所以这么先使用ISO-8859-1解码,在转换成UTF-8 --> <%=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8") %>第三种方法:
1,在Tomcat目录下找到conf\server.xml文件,在Connector节点添加useBodyEncodingForURI="true"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>2,在jsp界面添加如下代码。
<%request.setCharacterEncoding("UTF-8");%>
如果你在server.xml文件中设置的相关配置在tomcat重启后被还原请参考此文章解决: https://www.cnblogs.com/zuosl/p/4342190.html
POST请求方法参数乱码
方法一:在jsp文件的开头添加如下代码来设置字符集编码。
<% request.setCharacterEncoding("UTF-8"); %>方法二:
此方法是对方法一的改进,如果jsp页面很多,每个页面都这么设置一下很麻烦(主要是硬编码了字符集设置),我们可以配置一个拦截器,拦截所有jsp,在拦截器统一设置字符集编码。
在web.xml配置过了器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>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> </web-app>CharacterEncodingFilter.java
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; /** * Servlet implementation class CharacterEncodingFilter */ public class CharacterEncodingFilter implements Filter { protected String encoding = null; @Override public void destroy() { this.encoding = null; } @Override public void init(FilterConfig filterConfig) throws ServletException { this.encoding = filterConfig.getInitParameter("encoding"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(encoding); response.setContentType("text/html;charset=" + encoding); chain.doFilter(request, response); } }