jsp亂碼

jsp亂碼


JSP亂碼的原因有多種,需要一一分析解決,我一直收藏着這篇文章(出處找不到了,知道的不妨告訴我一聲,謝謝),基本上可以解決大部分的JSP中文亂碼問題了:中文亂碼
JSP的中文字符一直是各位初學者首先要解決的問題,下面進行了總結,也給出瞭解決辦法。
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編碼。
2 JSP中文編碼轉換
針對Tomcat下動態內容的中文亂碼問題,有以下幾個解決辦法:
2.1. 在每個JSP文件的開頭增加如下代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

2.2. 設置編碼參數:
request.setCharacterEncoding("UTF-8");

2.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的結合。

2.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"/>
改完後要重啓Tomcat,如果是用eclipse要重建一個server項目,這樣修改才生效
該方法用來解決瀏覽器地址欄中的傳遞中文參數導致的亂碼問題。瀏覽器地址欄傳遞參數(URL傳參)一般表現爲三種情況:form表單的get方法提交、超鏈接傳參和response傳參。
1) form表單提交方法是get:
<form action="registerProcess.jsp" method="get">
2) 在超鏈接中傳遞中文參數:
<a href="a.jsp?p=中文參數">超鏈接傳遞中文參數測試</a>

2.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>

2.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。

3 MySQL數據庫中文編碼轉換
在設定連接數據庫URL時指定字符編碼,可以確保數據正確的現實在網頁上:
jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8;

4 存在的問題與題外話
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等合法編碼。
用戶在使用這個方法的時候需要確定源編碼和目標編碼各是什麼,才能解決中文亂碼問題。

4.2. 題外話
數據庫的編碼問題除了可以修改連接URL之外,也可以採用方法:
String p = new String(p.getBytes(“源編碼”),”目標編碼”)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章