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

PHP 實作 JavaScript escape() 編碼函數:支援多位元組字元 (UTF-8/Big5)

     編輯:PHP 綜合知識

應用場景

前端需 unescape() 解碼的內容,後端 PHP 需產生相容編碼。常用於隱藏郵件連結、動態產出 JS 程式碼防爬蟲。

UTF-8 版 escapeToHex

<?php
/**
 * 將字串編碼為 JS escape() 相容格式 (%XX 或 %uXXXX)
 *
 * @param string $string 輸入字串
 * @param string $encoding 字串編碼 (預設 UTF-8)
 * @return string 編碼後字串
 */
function escapeToHex($string, $encoding = 'UTF-8')
{
    $return = '';
    $len = mb_strlen($string, $encoding);

    for ($i = 0; $i < $len; $i++) {
        $ch = mb_substr($string, $i, 1, $encoding);
        $byteLen = strlen($ch);

        if ($byteLen > 1) {
            // 多位元組字元 → %uXXXX (UCS-2BE)
            $ucs2 = mb_convert_encoding($ch, 'UCS-2BE', $encoding);
            $return .= '%u' . strtoupper(bin2hex($ucs2));
        } else {
            // ASCII 單位元組 → %XX
            $return .= '%' . strtoupper(bin2hex($ch));
        }
    }
    return $return;
}
?>

使用範例:隱藏郵件連結

<?php
$link = '<a href="mailto:admin@example.com">聯絡我們</a>';
$encoded = escapeToHex($link);

echo '<script>document.write(unescape("' . $encoded . '"));</script>';
// 輸出: 
?>

Big5/GBK 版 (舊專案相容)

<?php
function escapeToHexBig5($string)
{
    $return = '';
    $len = strlen($string);
    for ($i = 0; $i < $len; $i++) {
        $ord = ord($string[$i]);
        if ($ord > 127) {
            // 雙位元組 Big5
            $hi = $ord;
            $lo = ord($string[++$i]);
            $return .= '%u' . strtoupper(dechex(($hi << 8) | $lo));
        } else {
            $return .= '%' . strtoupper(dechex($ord));
        }
    }
    return $return;
}
?>

現代替代方案

  • JSON + encodeURIComponent:json_encode($str) 前端 decodeURIComponent,支援完整 Unicode
  • Base64:base64_encode / atob(),二進位安全
  • CSP + Nonce:從架構層面禁止內聯腳本,徹底解決 XSS 與混淆需求

注意事項

  • unescape() 已在 ECMAScript v3 棄用,現代瀏覽器仍支援但不建議新專案使用
  • decodeURIComponent 對多位元組字元處理較佳,搭配 encodeURIComponent 為首選
  • 僅作為「提高爬蟲門檻」,非安全機制,敏感資料勿輸出至前端
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved