在 jQuery AJAX 開發中,Firefox/Chrome 正常,IE 卻報 c00ce56e(編碼不匹配)並靜默失敗。本文記錄真實排查過程,揭示編碼鏈路中任何一環不一致即可觸發的跨瀏覽器兼容性陷阱。
$.ajax({ dataType: 'html', type: 'GET' });header('Content-type: text/html;charset=utf-8');<meta charset="utf-8">;error 回調,errorThrown 為 c00ce56e。error 回調中 alert(errorThrown) 獲取錯誤代碼,而非只看 console.log;Content-Type: text/html;charset=utf8(缺少連字符),而頁面聲明 utf-8;charset utf8; 強制覆蓋了 PHP 設置的 utf-8;charset utf-8; 並 reload,問題即時解決。| 環節 | 正確值 | 常見錯誤 | 檢查方法 |
|---|---|---|---|
| HTML 頁面 | <meta charset="utf-8"> (HTML5) 或 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | 寫成 utf8、大寫 UTF-8、缺失 | View Source 確認 |
| PHP 響應頭 | header('Content-Type: application/json; charset=utf-8') (JSON) 或 text/html; charset=utf-8 | 未設置、charset 拼寫錯誤、被框架覆蓋 | curl -I / F12 Network 查看 Response Headers |
| Web 服務器 | Nginx: charset utf-8; Apache: AddDefaultCharset utf-8 | 配置 utf8、未配置導致默認 iso-8859-1 | curl -I 觀察無 PHP 時的響應頭 |
| 數據庫連接 | PDO DSN charset=utf8mb4 / SET NAMES utf8mb4 | 未設置、用 utf8 (MySQL utf8 非完整 Unicode) | 查看 SHOW VARIABLES LIKE 'character_set%' |
| 數據表/列 | CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | 默認 latin1、utf8 | SHOW CREATE TABLE |
| PHP 源文件編碼 | UTF-8 無 BOM | GBK、UTF-8 with BOM | 編輯器右下角/ file 命令檢查 |
| JS 文件編碼 | UTF-8 | GBK、含 BOM | 同上 |
Content-Type charset 參數必須符合 IANA 註冊名稱(utf-8 而非 utf8);c00ce56e = INET_E_INVALID_CHARSET,表示「無效的字符集聲明」。<?php
// 1. 入口文件統一設置(最早執行)
header('Content-Type: application/json; charset=utf-8'); // API
// 或
header('Content-Type: text/html; charset=utf-8'); // 頁面
// 2. 數據庫連接統一
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
// 3. 輸出 JSON 統一
function jsonOut($data, int $code = 0, string $msg = '') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['code' => $code, 'msg' => $msg, 'data' => $data], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
?>
# 2. Nginx 統一 (http 或 server 塊)
charset utf-8;
# 避免 location 級別衝突,建議只在 http 級別設置一次
# 3. Apache 統一 (.htaccess 或 httpd.conf)
AddDefaultCharset utf-8
AddCharset utf-8 .html .htm .json .xml .css .js
<!-- 4. HTML 統一 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- 其它 meta -->
</head>
<body>...</body>
</html>
<?php
// 1. 查看實際發送的頭
header('X-Debug-Charset: utf-8'); // 自定義頭驗證 PHP 設置生效
// 2. 捕獲輸出緩衝區內容檢查
ob_start();
// ... 業務代碼 ...
$content = ob_get_clean();
echo "DEBUG: Content length " . strlen($content) . ", first 100: " . json_encode(mb_substr($content, 0, 100)) . "\n";
echo $content;
// 3. 強制瀏覽器以指定編碼渲染(測試用)
// header('Content-Type: text/html; charset=gbk'); // 故意錯誤觀察現象
?>
c00ce56e 是「編碼聲明不一致」在 IE 中的具體體現。解決之道只有一個:全鏈路統一 UTF-8。
<meta charset="utf-8">;header('Content-Type: ...; charset=utf-8');charset utf-8; / Apache AddDefaultCharset utf-8;charset=utf8mb4;工程化手段:在項目啟動腳本、CI/CD 檢查、代碼規範文檔中強制約束,從源頭消除編碼地雷。