參考:javascript
http://blog.csdn.net/beijiguangyong/article/details/7414247html
http://www.zhihu.com/question/20212696java
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編碼。mysql
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>
方法一、方法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。web
C4.3 MySQL數據庫中文編碼轉換
在設定鏈接數據庫URL時指定字符編碼,能夠確保數據正確的現實在網頁上:
jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8;sql
C4.4 存在的問題與題外話
1. 存在問題
在第二節的第四部分提到了修改Tomcat根目錄中conf子目錄下的server.xml文件,以支持在URL中傳遞中文參數。
這種方法存在一個問題,就是Tomcat服務器下可能不止一個Web應用,而多個Web應用的編碼又不同,這個時候就不能修改server.xml了。能夠嘗試採用:
String p = new String(p.getBytes(「源編碼」),」目標編碼」)
源編碼能夠是:ISO-8859-一、GB2312和GBK等合法編碼;
目標編碼爲:UTF-八、GBK和GB2312等合法編碼。
用戶在使用這個方法的時候須要肯定源編碼和目標編碼各是什麼,才能解決中文亂碼問題。
2. 題外話
數據庫的編碼問題除了能夠修改鏈接URL以外,也能夠採用方法:
String p = new String(p.getBytes(「源編碼」),」目標編碼」)數據庫