中文亂碼是 Java Web 開發的經典痛點,核心原則只有一條:全鏈路編碼統一。
CHARSET=utf8mb4(支援 Emoji)jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
在 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>
server.xml 中 HTTP Connector 新增:
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
| 層級 | 檢查項 |
|---|---|
| 資料庫 | SHOW VARIABLES LIKE 'character_set%'; 全部為 utf8mb4 |
| 連線池 | Druid/HikariCP 連線屬性含 characterEncoding |
| ORM | Hibernate/MyBatis 配置檔無硬編碼覆蓋 |
| 前端 | HTML 、JS 檔案存為 UTF-8 |
| 伺服器 | Tomcat server.xml URIEncoding、JVM -Dfile.encoding=UTF-8 |