在 Tomcat 7.0 環境下,JSP 頁面以超連結傳遞中文參數,Servlet 接收後出現亂碼。已嘗試設定 JSP、Servlet、server.xml 均為 UTF-8,並使用 `new String(str.getBytes("ISO-8859-1"), "UTF-8")` 轉碼,問題依舊。
Tomcat 7 預設 URI 編碼為 ISO-8859-1,GET 請求的查詢字串在到達 Servlet 前已被容器按此編碼解析。單純在應用層轉碼無效,必須在容器層面指定 URI 編碼。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// GET 請求靠 URIEncoding,這裡無需再設定
String param = req.getParameter("param");
// 直接使用 param 即可
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); // POST 必須手動設定
// ...
}
}
切勿在 Servlet 中再次手動轉碼(如 `new String(...)`),這會導致已正確解碼的字串再次被破壞。
在瀏覽器開發者工具 Network 分頁查看 Request URL,確認中文參數已正確 URL 編碼(如 `%E4%B8%AD%E6%96%87`),且 Servlet 直接 `getParameter` 即可獲得正確字串。
若專案較大,建議編寫一個 `CharacterEncodingFilter` 統一設定請求/回應編碼,並在 `web.xml` 中映射到 `/*`。