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(...) → 中文 |
encodeURIComponent (UTF-8 百分號編碼),escape 不處理非 BMP 字符 (Emoji 等) 且行為不標準。json_encode($str, JSON_UNESCAPED_UNICODE) 會直接輸出 Unicode 字符而非 \uXXXX,會導致本方法失效。請勿使用此旗標。encodeURIComponent / decodeURIComponent (JS) 對應 PHP rawurlencode / rawurldecode。更多 PHP 相關內容可參考本站專題:《PHP 中 JSON 格式數據操作技巧匯總》、《PHP 錯誤與異常處理方法總結》、《PHP 字符串用法總結》、《PHP 陣列操作技巧大全》、《PHP 運算與運算符用法總結》、《PHP 網絡編程技巧總結》、《PHP 基本語法入門教程》、《PHP 面向對象程序設計入門教程》、《PHP+MySQL 數據庫操作入門教程》及《PHP 常見數據庫操作技巧匯總》。