**IE 8/9/10/11** 下 jQuery AJAX 請求返回成功 (HTTP 200),但進入 `error` 回調,`errorThrown` 提示:
`Error: 由於出現錯誤 c00ce56e 而導致此項操作無法完成` (Operation aborted due to error c00ce56e)。
**Firefox/Chrome 完全正常**。
`0xC00CE56E` = **XML_PARSER_ERROR** (MSXML 解析器錯誤)。
**核心原因**:**響應內容的實際編碼與聲明編碼不一致**,導致 IE 內置 MSXML 解析器 (jQuery AJAX 依賴 `responseXML`/`responseText` 解析) 拋出解析異常並中止腳本執行。
# 1. HTML 頁面聲明
<meta charset="utf-8">
# 2. PHP 響應頭聲明
header('Content-Type: text/html; charset=utf-8'); // PHP 也聲明 UTF-8
# 3. Nginx 配置強制覆蓋
server {
charset utf-8; # ← 關鍵:Nginx 強制在響應頭添加 Content-Type: text/html; charset=utf-8
# 但如果 Nginx 配置寫成 charset utf8; (無連字符)
# 某些版本會發送 charset=utf8 (非標準 IANA 名稱)
# 導致瀏覽器識別為未知編碼,回退到系統默認 (GBK/Big5),與實際 UTF-8 內容衝突
}
# 4. 實際響應頭 (F12 Network 看到)
Content-Type: text/html; charset=utf8 # 非標準寫法
# 或
Content-Type: text/html; charset=utf-8 (正確)
# 但實際內容可能被 PHP 輸出為 GBK (文件編碼錯誤)
# 或數據庫連接編碼錯誤導致讀出 GBK 但聲明 UTF-8
| 層級 | 檢查點 | 標準值 |
|---|---|---|
| **文件編碼** | 編輯器保存編碼 (VS Code/PhpStorm/Notepad++) | **UTF-8 without BOM** |
| **PHP 輸出編碼** | `header('Content-Type: ...; charset=utf-8');` + `mb_internal_encoding('UTF-8');` | UTF-8 |
| **數據庫連接編碼 | PDO: `charset=utf8mb4` / MySQLi: `SET NAMES utf8mb4` | utf8mb4 |
| **數據庫表/列編碼** | `CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` | utf8mb4 |
| **HTML 頁面聲明** | `` (在 `` 首位) | utf-8 |
| **Web Server 響應頭** | Nginx: `charset utf-8;` / Apache: `AddDefaultCharset utf-8` | utf-8 (帶連字符) |
| **AJAX 請求頭** | jQuery 默認發送 `Accept: */*`; 可顯式 `contentType: 'application/x-www-form-urlencoded; charset=UTF-8'` | UTF-8 |
# 正確示例
Content-Type: text/html; charset=utf-8
# 或 JSON 接口
Content-Type: application/json; charset=utf-8
# 錯誤示例 (導致 c00ce56e)
Content-Type: text/html; charset=utf8 # 缺少連字符,IE 不識別
Content-Type: text/html; charset=gb2312 # 聲明 GBK 但實際 UTF-8 內容
Content-Type: text/html # 缺少 charset,IE 回退默認編碼
# 甚至出現雙重 Content-Type (Nginx + PHP 都設置)
Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8 # 重複頭,IE 可能困惑
# ❌ 錯誤寫法 (無連字符)
charset utf8;
# ✅ 正確寫法 (標準 IANA 名稱)
charset utf-8;
# ✅ 更佳:僅在需要時設置,避免與 PHP 衝突
location ~ \.php$ {
fastcgi_pass php-fpm;
# 不要在這裡重複 charset,讓 PHP 控制
fastcgi_param HTTP_ACCEPT_CHARSET utf-8; # 傳遞給 PHP 參考
}
# 如果必須在 Nginx 層統一強制 (如靜態文件、反代)
server {
charset utf-8; # 加連字符!
# 確保不與 PHP 衝突:fastcgi_hide_header Content-Type; (慎用)
}
<?php
// 入口文件最頂部 (所有輸出前)
declare(encoding='UTF-8'); // PHP 5.4+ 聲明腳本編碼
// 1. 內部編碼
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8');
// 2. 輸出緩衝編碼轉換 (兜底)
ob_start(function ($buffer) {
return mb_convert_encoding($buffer, 'UTF-8', 'UTF-8, GBK, GB2312'); // 嘗試修正
});
// 3. 統一響應頭 (僅發送一次)
if (!headers_sent()) {
header('Content-Type: text/html; charset=utf-8'); // 普通頁面
// header('Content-Type: application/json; charset=utf-8'); // API
}
// 4. 數據庫連接 (PDO 示例)
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass', [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
]);
// jQuery
$.ajax({
url: '/api/data',
type: 'GET',
dataType: 'html', // 或 json
// 關鍵:顯式告訴 jQuery 期望編碼 (雖然 jQuery 3+ 默認 UTF-8)
beforeSend: function(xhr) {
xhr.setRequestHeader('Accept', 'text/html; charset=utf-8');
},
// 關鍵:覆蓋 MIME 類型強制解碼 (針對 IE MSXML)
// 僅當 dataType='xml' 或自動檢測為 xml 時生效
// html/json 類型 jQuery 使用 responseText 而非 responseXML,通常不觸發 c00ce56e
// 但如果服務端錯誤返回 XML 宣告 (無連字符)
// 則會觸發。故根治在服務端。
});
// 原生 fetch (現代項目推薦)
fetch('/api/data', {
headers: {
'Accept': 'application/json; charset=utf-8',
'X-Requested-With': 'XMLHttpRequest'
}
}).then(r => r.text()) // 先拿文本
.then(text => {
// 手動處理編碼異常 (極少見)
return JSON.parse(text);
});
[ ] 所有 PHP/JS/CSS/HTML 文件保存為 UTF-8 without BOM
[ ] PHP 入口: mb_internal_encoding('UTF-8'); header('Content-Type: ...; charset=utf-8');
[ ] 數據庫連接: SET NAMES utf8mb4 / PDO charset=utf8mb4
[ ] 數據庫表/列: CHARSET=utf8mb4
[ ] HTML: 在 首位
[ ] Nginx: charset utf-8; (帶連字符!) 且不與 PHP 衝突
[ ] Apache: AddDefaultCharset utf-8
[ ] AJAX 接口返回 JSON 而非 HTML 片段 (避免編碼檢測歧義)
[ ] 現代項目棄用 jQuery AJAX,改用 fetch + 明確 .json()/.text()
[ ] IE 兼容性需求低則直接放棄 IE 支持 (Microsoft 已停止支持 IE 11)
核心結論:`c00ce56e` 是 **IE 對非標準編碼聲明零容忍** 的體現。根治不在前端,而在 **後端/Web Server 統一規範輸出 `charset=utf-8` (帶連字符) 並確保內容真實為 UTF-8**。現代化項目應全棧 UTF-8、棄用 XML 接口、遷移至 fetch/JSON、放棄 IE 支持。