JSP的中文字符一直是各位初學者首先要解決的問題,下面進行了總結,也給出了解決辦法。
C4.1 HTML中文編碼轉換
在JSP文件中的靜態(tài)文字顯示亂碼,則需要在<head></head>之間增加中文設置代碼,如清單附C-5所示。
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
charset指定UTF-8字符集,當然也可以指定其他支持中文的編碼,如GBK和GB2312。但是整個Web應用中一定要統(tǒng)一一種編碼,本書推薦統(tǒng)一為UTF-8編碼。
C4.2 JSP中文編碼轉換
針對Tomcat下動態(tài)內(nèi)容的中文亂碼問題,有以下幾個解決辦法:
1. 在每個JSP文件的開頭增加如下代碼:
<%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
2. 設置編碼參數(shù):
request.setCharacterEncoding("UTF-8");
3. 使用編碼過濾器。創(chuàng)建過濾器類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;
public class SetCharacterEncoding implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
//設置字符編碼
request.setCharacterEncoding("UTF-8");
//將控制傳到下一個過濾器,如果沒有過濾器則傳到被調(diào)用者
chain.doFilter(request, response);
}
@Override
public void 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經(jīng)常需要使用,但它們一般不是獨立使用,而是兩兩結合:1和2結合;1和3結合。附錄A中的示例用到了1和2的結合。第四章Hibernate中的信息發(fā)布系統(tǒng)用到了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"/>
該方法用來解決瀏覽器地址欄中的傳遞中文參數(shù)導致的亂碼問題。瀏覽器地址欄傳遞參數(shù)(URL傳參)一般表現(xiàn)為三種情況:form表單的get方法提交、超鏈接傳參和response傳參。
Ø form表單提交方法是get:
<form action="registerProcess.jsp"method="get">
Ø 在超鏈接中傳遞中文參數(shù):
<ahref="a.jsp?p=中文參數(shù)">超鏈接傳遞中文參數(shù)測試</a>
5. 如果是調(diào)用response.sendRedirect傳遞中文參數(shù)產(chǎn)生的亂碼,如:
response.sendRedirect("a.jsp?p=中文參數(shù)");
請修改成如:
<% //引入URLEncoder %>
<%@pageimport="java.net.URLEncoder"%>
<%
String p = "中文參數(shù)";
//對中文參數(shù)編碼
p = URLEncoder.encode(p, "UTF-8");
response.sendRedirect("a.jsp?p=" + p);
%>
以解決亂碼問題。
如果方法4還不能解決某些超鏈接傳參亂碼問題,請使用方法5,如下:
<%@pageimport="java.net.URLEncoder"%>
<%
String p = "中文參數(shù)";
//對中文參數(shù)編碼
p = URLEncoder.encode(p, "UTF-8");
%>
<a href="a.jsp?p=<%=p%>">超鏈接傳遞中文參數(shù)測試</a>
6. JavaScript中如果出現(xiàn)URL傳參亂碼問題,如:
open("a.jsp?p=中文參數(shù)");
請修改成:
<script type="text/javascript">
function openWindow()
{
var url = "a.jsp?p=中文參數(shù)";
url = encodeURI(url);
open(url);
}
</script>
<input type="button" value="JavaScript中文參數(shù)"
onclick="openWindow();">
以解決亂碼問題。
JavaScript中的open方法打開瀏覽器窗口,傳遞參數(shù),其本質(zhì)也是URL傳參。一般方法4就可以很好的解決中文參數(shù)亂碼問題。如果方法4不生效,才考慮方法六。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。