escape() 變為 %uXXXX 格式。$_POST 時若未聲明編碼,可能按 ISO-8859-1 解析導致亂碼。Content-Type: charset=...,JS 解碼 responseText 時按 UTF-8 強制解析,GBK 頁面必亂。// 現代寫法(推薦)
const data = new URLSearchParams();
data.append('action', action);
data.append('val', val); // 自動 UTF-8 編碼
fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: data
});
舊代碼修正:將 escape(val) 改為 encodeURIComponent(val)(escape 已棄用,不支援 UTF-8 多字節)。
<?php
// 入口文件最頂部
header('Content-Type: application/json; charset=UTF-8');
mb_internal_encoding('UTF-8');
// 解碼(若前端用 escape 產生 %uXXXX)
$val = $_POST['val'] ?? '';
$val = rawurldecode(preg_replace('/%u([0-9A-F]{4})/i', '$1;', $val));
// 或直接要求前端改用 encodeURIComponent
<?php
// PHP
header('Content-Type: text/html; charset=UTF-8'); // 或 JSON
// ASP
Response.Charset = "UTF-8";
// JSP
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
| 環節 | 配置 |
|---|---|
| HTML 頁面 | <meta charset="UTF-8"> |
| JS 文件 | 存儲為 UTF-8 無 BOM |
| PHP 文件 | 存儲為 UTF-8 無 BOM |
| MySQL 連接 | SET NAMES utf8mb4 / PDO dsn charset=utf8mb4 |
| 資料庫/表/列 | DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
| Nginx/Apache | add_header Content-Type "text/html; charset=utf-8"; |