中文在 ISO-8859-1(Latin-1)與 UTF-8 間多次轉碼導致資訊損失。典型流程:瀏覽器 UTF-8 編碼 → Tomcat 預設 ISO-8859-1 解碼 → Java 字串內部 UTF-16 → 輸出時再編碼。任何一環不一致即產生亂碼。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <meta charset="UTF-8">
server.xml)<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
web.xml)<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
req.setCharacterEncoding("UTF-8"); // 請求體解碼
resp.setContentType("text/html;charset=UTF-8"); // 回應編碼
// 業務邏輯...
}
String raw = request.getParameter("username"); // 已被 ISO-8859-1 錯誤解碼
String fixed = new String(raw.getBytes("ISO-8859-1"), "UTF-8"); // 還原再正確解碼
Content-Type: application/x-www-form-urlencoded; charset=UTF-8request.getParameter() 返回值server.servlet.encoding.charset=UTF-8 server.servlet.encoding.force=truecharacterEncoding=utf8&useUnicode=trueaccept-charset="UTF-8"