前端需 unescape() 解碼的內容,後端 PHP 需產生相容編碼。常用於隱藏郵件連結、動態產出 JS 程式碼防爬蟲。
<?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>';
// 輸出:
?>
<?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;
}
?>
encodeURIComponent:json_encode($str) 前端 decodeURIComponent,支援完整 Unicodebase64_encode / atob(),二進位安全unescape() 已在 ECMAScript v3 棄用,現代瀏覽器仍支援但不建議新專案使用decodeURIComponent 對多位元組字元處理較佳,搭配 encodeURIComponent 為首選