核心概念
- 字符:文字、符號、數字的總稱
- 字符集:字符的集合 (如 ASCII, GB2312, Unicode)
- 字符編碼:將字符集映射為位元組序列的規則 (如 UTF-8, GBK)
歷史演進時間軸
1. ASCII (1963/1968 標準化)
- 7 位元,128 字符 (0-127)
- 控制字符 (CR, LF, BEL 等) + 可顯示字符 (英數、標點)
- ISO 646 國際標準
- 擴展 ASCII:8 位元,256 字符,含表格符、希臘字母、拉丁擴展
2. 國標碼系列 (中國)
| 標準 | 年份 | 字符數 | 編碼方式 | 說明 |
| GB2312-80 | 1980 | 6763 | 雙位元 (EUC-CN) | 一級漢字 3755 + 二級 3008 + 符號 |
| GBK | 1995 | 21886 | 雙位元,GB2312 超集 | 含繁體、日韓漢字、擴展符號 |
| GB18030-2000 | 2000 | 27533 | 單/雙/四位元混合 | 國家強制標準,含少數民族字、CJK 擴展 A |
| GB18030-2005 | 2005 | 70244 | 四位元 | 含 CJK 擴展 B,與 Unicode 基本同步 |
3. Big5 (繁體中文)
- 雙位元編碼,通用於台灣、香港
- Big5-2003 (HKSCS) 擴展香港增補字符集
4. Unicode 萬國碼
- 目標:為每個字符分配唯一碼位
- 碼位範圍:U+0000 ~ U+10FFFF (17 個平面)
- BMP (基本多文種平面) U+0000~U+FFFF 涵蓋絕大多數常用字
Unicode 編碼實現方案
| 編碼 | 位元 | 特點 | 適用場景 |
| UTF-32 | 固定 32 位 | 直接對應碼位,空間浪費大 | 內部處理、隨機存取 |
| UTF-16 | 16/32 位變長 | BMP 2 字節,補充平面 4 字節 (代理對) | Windows API、Java、JS 內部 |
| UTF-8 | 8/16/24/32 位變長 | ASCII 兼容、無位元組序問題、網頁標準 | Web、資料庫、檔案儲存、傳輸 |
UTF-8 編碼規則
U+0000 ~ U+007F : 0xxxxxxx (1 字節,兼容 ASCII)
U+0080 ~ U+07FF : 110xxxxx 10xxxxxx (2 字節)
U+0800 ~ U+FFFF : 1110xxxx 10xxxxxx 10xxxxxx (3 字節,含中日韓)
U+10000 ~ U+10FFFF : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4 字節)
PHP 中的編碼處理最佳實踐
- 檔案編碼:統一 UTF-8 無 BOM
- 資料庫:
CHARSET=utf8mb4 (支援 4 字節 Emoji)
- HTTP 輸出:
header('Content-Type: text/html; charset=utf-8')
- 內部處理:PHP 5.6+
default_charset = "UTF-8"
- 函數選擇:
mb_* 系列處理多位元組字串,避免 strlen/substr 截斷
- 轉換:
mb_convert_encoding($str, 'UTF-8', 'GBK') 或 iconv()
常見亂碼成因與排查
| 現象 | 原因 | 解決 |
| | UTF-8 資料以 Latin1 顯示 | 確認連線字符集 SET NAMES utf8mb4 |
| 鍛/ | GBK 資料以 UTF-8 顯示 | 正確宣告來源編碼再轉換 |
| ???? | 字體缺失字形 | 安裝支援字符的字體 |