标签:des blog class code java ext
参考:
http://blog.csdn.net/beijiguangyong/article/details/7414247
http://www.zhihu.com/question/20212696
C4 中文乱码   
JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法。    
C4.1 
HTML中文编码转换    
在JSP文件中的静态文字显示乱码,则需要在<head></head>之间增加中文设置代码,如清单附C-5所示。    
<meta http-equiv="Content-Type" content="text/html; 
charset=UTF-8">    
charset指定UTF-8字符集,当然也可以指定其他支持中文的编码,如GBK和GB2312。但是整个Web应用中一定要统一一种编码,推荐统一为UTF-8编码。
C4.2 JSP中文编码转换    
针对Tomcat下动态内容的中文乱码问题,有以下几个解决办法:    
1. 
在每个JSP文件的开头增加如下代码:    
<%@ page language="java" 
contentType="text/html; 
charset=UTF-8"
pageEncoding="UTF-8"%>    
2. 设置编码参数:    
request.setCharacterEncoding("UTF-8");    
3. 
使用编码过滤器。创建过滤器类SetCharacterEncoding,源码如清单附C-5所示。    
清单附C-5 
SetCharacterEncoding.java    
package chapc;    
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;    
publicclass 
SetCharacterEncoding implements Filter {    
@Override    
publicvoid destroy() {    
}    
@Override    
publicvoid doFilter(ServletRequest request, ServletResponse 
response,    
FilterChain chain) throws IOException, ServletException 
{    
//设置字符编码    
request.setCharacterEncoding("UTF-8");    
//将控制传到下一个过滤器,如果没有过滤器则传到被调用者    
chain.doFilter(request, response);    
}    
@Override    
publicvoid init(FilterConfig arg0) 
throws ServletException {    
}    
}    
过滤器类还需要在web.xml中进行配置,设定要过滤哪些请求。过滤器在web.xml中的配置如清单附C-6所示。    
清单附C-6 
web.xml片段    
<filter>    
<filter-name>SetCharacterEncoding</filter-name>    
<filter-class>chapc.SetCharacterEncoding</filter-class>    
</filter>    
<filter-mapping>    
<filter-name>SetCharacterEncoding</filter-name>    
<url-pattern>/*</url-pattern>    
</filter-mapping>    
方法1、方法2和方法3经常需要使用,但它们一般不是独立使用,而是两两结合:1和2结合;1和3结合。附录A中的示例用到了1和2的结合。第四章Hibernate中的信息发布系统用到了1和3的结合。 
   
4. 修改Tomcat根目录中conf子目录下的server.xml文件,在中加入URIEncoding="UTF-8",如清单附C-7所示。   
 
清单附C-7 server.xml片段    
<Connector 
connectionTimeout="20000"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"
URIEncoding="UTF-8"/> 
   
该方法用来解决浏览器地址栏中的传递中文参数导致的乱码问题。浏览器地址栏传递参数(URL传参)一般表现为三种情况:form表单的get方法提交、超链接传参和response传参。 
   
1) form表单提交方法是get:    
<form action="registerProcess.jsp" 
method="get">    
2) 在超链接中传递中文参数:    
<a 
href="a.jsp?p=中文参数">超链接传递中文参数测试</a>    
5. 
如果是调用response.sendRedirect传递中文参数产生的乱码,如:    
response.sendRedirect("a.jsp?p=中文参数");    
请修改成如:    
<% 
//引入URLEncoder %>    
<%@page import="java.net.URLEncoder"%>  
  
<%    
String p = "中文参数";    
//对中文参数编码    
p = 
URLEncoder.encode(p, "UTF-8");    
response.sendRedirect("a.jsp?p=" + p);    
%>    
以解决乱码问题。    
如果方法4还不能解决某些超链接传参乱码问题,请使用方法5,如下:    
<%@page import="java.net.URLEncoder"%>    
<%    
String p = "中文参数";    
//对中文参数编码    
p = URLEncoder.encode(p, 
"UTF-8");    
%>    
<a href="a.jsp?p=<%=p 
%>">超链接传递中文参数测试</a>    
6. JavaScript中如果出现URL传参乱码问题,如:    
open("a.jsp?p=中文参数");    
请修改成:    
<script 
type="text/javascript">    
function openWindow()    
{   
 
var url = "a.jsp?p=中文参数";    
url = encodeURI(url);    
open(url);    
}    
</script>    
<input 
type="button" 
value="JavaScript中文参数"
onclick="openWindow();">    
以解决乱码问题。    
JavaScript中的open方法打开浏览器窗口,传递参数,其本质也是URL传参。一般方法4就可以很好的解决中文参数乱码问题。如果方法4不生效,才考虑方法6。
C4.3 MySQL数据库中文编码转换    
在设定连接数据库URL时指定字符编码,可以确保数据正确的现实在网页上:    
jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8;
C4.4 存在的问题与题外话    
1. 存在问题    
在第二节的第四部分提到了修改Tomcat根目录中conf子目录下的server.xml文件,以支持在URL中传递中文参数。    
这种方法存在一个问题,就是Tomcat服务器下可能不止一个Web应用,而多个Web应用的编码又不一样,这个时候就不能修改server.xml了。可以尝试采用: 
   
String p = new String(p.getBytes(“源编码”),”目标编码”)    
源编码可以是:ISO-8859-1、GB2312和GBK等合法编码;    
目标编码为:UTF-8、GBK和GB2312等合法编码。    
用户在使用这个方法的时候需要确定源编码和目标编码各是什么,才能解决中文乱码问题。    
2. 题外话    
数据库的编码问题除了可以修改连接URL之外,也可以采用方法:    
String p = new 
String(p.getBytes(“源编码”),”目标编码”)
标签:des blog class code java ext
原文地址:http://www.cnblogs.com/humeng126/p/3718422.html