請求 /downloadservlet?name=小兒鼻出血.mp4 時,後端取得參數變亂碼。嘗試 new String(name.getBytes("ISO-8859-1"), "UTF-8") 反而產生新亂碼,URLDecoder 也無效。
瀏覽器發送 URL 編碼、Tomcat 解碼、JSP/ Servlet 讀取參數三個環節編碼不一致導致。單靠代碼轉碼屬治標不治本。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
}
或在 web.xml 註冊 Spring 提供的 CharacterEncodingFilter。
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
重啟 Tomcat 後,直接在瀏覽器輸入含中文的 URL,後端 request.getParameter("name") 應直接取得正確字串,無需任何手動轉碼。
