首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP + AJAX 中文亂碼終極解決:escape() 編碼 + Header 聲明雙管齊下

     編輯:PHP 綜合知識

問題根因

  • JS 發送時默認 UTF-8 編碼,中文經 escape() 變為 %uXXXX 格式。
  • PHP 接收 $_POST 時若未聲明編碼,可能按 ISO-8859-1 解析導致亂碼。
  • 響應端若無 Content-Type: charset=...,JS 解碼 responseText 時按 UTF-8 強制解析,GBK 頁面必亂。

前端發送:encodeURIComponent() 替代 escape()

// 現代寫法(推薦)
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 多字節)。

後端接收:統一 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', '&#x$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");

全鏈路 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/Apacheadd_header Content-Type "text/html; charset=utf-8";
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved