| 編碼 | 類型 | 覆蓋範圍 | 特點 |
|---|---|---|---|
| ISO-8859-1 (Latin-1) | 單位元組 | 西歐語系 | 0-255 直接映射,Java 預設網路編碼 |
| GB2312 / GBK / GB18030 | 雙位元組 (兼容 ASCII) | 簡體/繁體中文 | 中文最節省空間 (2 bytes/字),GBK 支援繁體 |
| UTF-16 / UCS-2 | 固定雙位元組 (含 BOM) | 所有 Unicode | Java 內部 `char`/`String` 採用 UTF-16 |
| UTF-8 | 變長 (1-4 bytes) | 所有 Unicode | ASCII 兼容、無 BOM、網路傳輸/儲存首選 |
// String (UTF-16) → byte[] (指定編碼)
byte[] utf8Bytes = "中文".getBytes(StandardCharsets.UTF_8); // [E4, B8, AD, E6, 96, 87]
byte[] gbkBytes = "中文".getBytes("GBK"); // [D6, D0, CE, C4]
// byte[] → String (指定編碼解碼)
String s1 = new String(utf8Bytes, StandardCharsets.UTF_8); // 正確
String s2 = new String(gbkBytes, "GBK"); // 正確
String s3 = new String(gbkBytes, StandardCharsets.ISO_8859_1); // 亂碼:?
鐵律: 編碼與解碼必須完全對稱,否則產生亂碼或資料損失 ( 替換字元)。
// Spring Boot 自動配置已處理,手動 Servlet 需:
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, res);
}
}
# MySQL 8.0+ 預設 utf8mb4 (支援 Emoji)
# 連線字串
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Taipei
# 表建立
CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
// 應用層編碼 (非整個 URL)
String param = "中文/參數";
String encoded = URLEncoder.encode(param, StandardCharsets.UTF_8); // %E4%B8%AD%E6%96%87%2F%E5%8F%83%E6%95%B8
String decoded = URLDecoder.decode(encoded, StandardCharsets.UTF_8);
注意:`URLEncoder` 將空格編為 `+` (表單標準),URL 路徑段落應用 `UriUtils.encodePathSegment` (Spring) 或手動將 `+` 改 `%20`。