1. 静态页面的乱码问题
文件的编码和浏览器要显示的编码不一致。
1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看;
2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容.
- <meta http-equiv="content-type" content="text/html; charset=GBK">
<meta http-equiv="content-type" content="text/html; charset=GBK">
2. JSP 页面的乱码问题
1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成ISO8859-1 就不能保存汉字;
2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让浏览器来优先选择一种编码.
如果JSP 乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能正确显示
3. 表单提交的乱码问题(Tomcat 特有)
1). POST 的乱码
a. 首先浏览器提交表单的编码是根据表单所在页面来决定的, 而不是根据提交后的JSP 页面的编码来决定的. 把所有的页面的编码都设置成一样的,例如 GBK.
b. 处理方式就是在获取参数之前设置编码:
request.setCharacterEncoding("GBK");
c. 可以用过滤器的方式来解决, Tomcat 已经带了一个现成的:
apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacter
EncodingFilter.java
web.xml
- <filter>
- <filter-name>Set Character Encoding</filter-name>
- <filter-class>filters.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GBK</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Set Character Encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
<filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2) GET 方式的乱码
a.手动转码:用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式.
- String username = request.getParameter("username");
- System.out.println(username);
- // 转码, 先取得原始的二进制字节数组
- byte[] data = username.getBytes("ISO8859-1");
- // 根据新的字符集再构造新的字符串
- username = new String(data, "GBK");
String username = request.getParameter("username"); System.out.println(username); // 转码, 先取得原始的二进制字节数组 byte[] data = username.getBytes("ISO8859-1"); // 根据新的字符集再构造新的字符串 username = new String(data, "GBK");
b.配置tomcat(java web项目常用的服务器)的链接编码
在Jsp的页面中通过超链接传参数,例如:<a href="ss.jsp?userName=zhangsan"></a> 接收到的参数为乱码。解决办法:在tomcat安装目录下,找到conf目录,打开该目录下的server.xml文件,按照下面的代码进行配置,红色部分为要添加的内容,将其添上即可:
- <Connector port="8090" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" URIEncoding="UTF-8"/>
<Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
4.解决响应乱码:
所谓响应中的乱码,就是显示页面上的乱码,因为页面数据是从服务器一端放入响应(response)中,然后发送给浏览器,如果响应中的数据无法被正常解析,就会出现乱码问题。
在http的响应(response)中添加编码信息,使用如下方式:
- <%@ page contentType="text/html; charset=gb2312"%>
<%@ page contentType="text/html; charset=gb2312"%>
这段要放在jsp页面的第一行,用来指定响应的类型和编码格式,contentType为text/html就是html内容,charset表示编码为gb2312。这样浏览器就可以从响应中获得编码格式了。
在html中指定编码格式。
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>title</title>
- </head>
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>title</title> </head>
在Servlet中指定编码格式:
- response.setCharacterEncoding()
response.setCharacterEncoding()
附:JSP中的编码设置
1. pageEncoding:<%@ page pageEncoding="UTF-8"%> 设置JSP编译成Servlet时使用的编码
2. contentType: <%@ page contentType="text/html; charset=UTF-8"%> 对服务器响应进行重新编码,即jsp的输出流在浏览器中显示的编码
3. html页面charset:
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 网页的编码信息 ,说明页面制作所使用的编码
4. request.setCharacterEncoding() -- 可用在servlet和jsp页面中,作用是设置对客户端请求进行重新编码的编码,即post方式提交的数据进行编码。
5. response.setCharacterEncoding() -- 可用在servlet和jsp页面中,对服务器响应进行重新编码,即jsp的输出流在浏览器中显示的编码,
与<%@ page contentType="text/html;charset=UTF-8"%>一样
6. response.setContentType() -- 可用在servlet和jsp页面中,对服务器响应进行重新编码,即jsp的输出流在浏览器中显示的编码,与<%@ page contentType="text/html;charset=UTF-8"%>一样。如:response.setContentType("text/html;charset=GBK");
7.response.setHeader("Content-Type","text/html;charset=UTF-8"); -- 可用在servlet和jsp页面中。response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 response.setHeader( name, contect );
与<META http-equiv="Content-Type" content="text/html; charset=UTF-8">一样