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

PHP 實現 JavaScript escape/unescape:利用 JSON 編碼特性的巧妙轉換

     編輯:PHP 綜合知識

前言

JavaScript 的 escape() 和 unescape() 將字串轉換為 Unicode 十六進制格式 (如 %u4E2D%u6587),這與 JSON 的 Unicode 轉義格式 (\u4E2D\u6587) 高度相似。本文展示如何利用 PHP 內建的 json_encode/json_decode 快速實現相容的 escape/unescape 功能,無需手寫複雜解析邏輯。

核心實作

 %uXXXX 格式
 * 原理: json_encode 產生 \uXXXX -> 替換 \ 為 % -> 移除首尾引號
 */
function escape($str) {
    // json_encode 回傳包含雙引號的字串,如: "\u4e2d\u6587"
    // substr(..., 1, -1) 移除首尾引號
    // str_replace('\\', '%') 將 \u -> %u
    return str_replace('\\', '%', substr(json_encode($str), 1, -1));
}

/**
 * PHP 版 unescape:%uXXXX 格式 -> 字串
 * 原理: %u -> \u -> 包裝為 JSON 字串 -> json_decode
 */
function unescape($str) {
    // %u -> \u
    // 包裝雙引號構成合法 JSON 字串
    // json_decode 解析 Unicode 轉義
    return json_decode('"' . str_replace('%', '\\', $str) . '"');
}

// 測試
$str_escape = '徐州市 1234';
$str_unescape = '%u5f90%u5dde%u5e02 %u811a%u672c%u4e4b%u5bb6 1234';

echo "原始(unescape格式): $str_unescape\n";
echo "unescape結果: " . unescape($str_unescape) . "\n";
echo "原始(中文): $str_escape\n";
echo "escape結果: " . escape($str_escape) . "\n";
?>

執行結果

%u5f90%u5dde%u5e02 %u811a%u672c%u4e4b%u5bb6 1234
徐州市 1234
徐州市 1234
%u5f90%u5dde%u5e02 %u811a%u672c%u4e4b%u5bb6 1234

原理解析

步驟escape (中文 -> %uXXXX)unescape (%uXXXX -> 中文)
1 json_encode('中文') → "\u4e2d\u6587" 輸入 %u4e2d%u6587
2 substr(..., 1, -1) → \u4e2d\u6587 str_replace('%', '\\', ...) → \u4e2d\u6587
3 str_replace('\\', '%', ...) → %u4e2d%u6587 '"' . ... . '"' → "\u4e2d\u6587"
4 完成 json_decode(...) → 中文

完整測試套件

注意事項與限制

⚠️ 重要限制

  • JS escape 已棄用:現代 JS 建議使用 encodeURIComponent (UTF-8 百分號編碼),escape 不處理非 BMP 字符 (Emoji 等) 且行為不標準。
  • JSON_UNESCAPED_UNICODE:PHP 5.4+ json_encode($str, JSON_UNESCAPED_UNICODE) 會直接輸出 Unicode 字符而非 \uXXXX,會導致本方法失效。請勿使用此旗標。
  • 相容性:僅適用於需與舊系統 (使用 JS escape) 互通的場景。新專案請雙方統一使用 encodeURIComponent / decodeURIComponent (JS) 對應 PHP rawurlencode / rawurldecode。

現代標準替代方案

延伸閱讀

更多 PHP 相關內容可參考本站專題:《PHP 中 JSON 格式數據操作技巧匯總》、《PHP 錯誤與異常處理方法總結》、《PHP 字符串用法總結》、《PHP 陣列操作技巧大全》、《PHP 運算與運算符用法總結》、《PHP 網絡編程技巧總結》、《PHP 基本語法入門教程》、《PHP 面向對象程序設計入門教程》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved