PHP实现Javascript中的escape及unescape函数代码分享

在Web开发中,PHP和JavaScript是两种常用的编程语言,它们在不同的场景下发挥着重要作用,由于语言特性不同,JavaScript中的escape和unescape函数在PHP中并没有直接对应的内置函数,为了在PHP中实现类似的功能,开发者需要手动编写代码来模拟这些函数的行为,本文将详细介绍如何在PHP中实现JavaScript的escape和unescape函数,并提供完整的代码示例和解析。
JavaScript中的escape和unescape函数
JavaScript的escape函数用于对字符串进行编码,将某些非字母数字字符转换为十六进制转义序列,空格会被编码为%20,而中文字符会被编码为%uXXXX格式的Unicode转义序列,对应的unescape函数则用于将编码后的字符串还原为原始字符串。
需要注意的是,escape和unescape函数在现代JavaScript中已被废弃,推荐使用encodeURIComponent和decodeURIComponent替代,但在某些遗留系统中,仍可能需要兼容这些函数。
PHP实现escape函数
在PHP中实现JavaScript的escape函数,需要处理两种类型的编码:

- ASCII字符(0-127)中的非字母数字字符,转换为
%XX格式(十六进制)。 - 非ASCII字符(如中文),转换为
%uXXXX格式的Unicode转义序列。
以下是PHP实现escape函数的代码:
function js_escape($string) {
$escaped = '';
for ($i = 0; $i < strlen($string); $i++) {
$char = $string[$i];
$ord = ord($char);
if ($ord >= 32 && $ord <= 126) {
// 可打印ASCII字符直接保留
$escaped .= $char;
} else if ($ord < 256) {
// 非ASCII字符(0-255)转换为%XX格式
$escaped .= '%' . dechex($ord);
} else {
// 非ASCII字符(>255)转换为%uXXXX格式
$escaped .= '%u' . dechex($ord);
}
}
return $escaped;
}
代码解析
- 遍历字符串中的每个字符,获取其ASCII值(
ord)。 - 如果字符是可打印ASCII字符(32-126),直接保留。
- 如果字符是扩展ASCII字符(0-255),转换为
%XX格式的十六进制。 - 如果字符是Unicode字符(>255),转换为
%uXXXX格式的十六进制。
PHP实现unescape函数
unescape函数是escape的逆操作,需要将%XX和%uXXXX格式的编码还原为原始字符,以下是PHP实现unescape函数的代码:
function js_unescape($string) {
$unescaped = '';
$i = 0;
$len = strlen($string);
while ($i < $len) {
$char = $string[$i];
if ($char === '%' && $i + 1 < $len) {
// 处理%XX格式
if ($string[$i + 1] === 'u' && $i + 5 < $len) {
// 处理%uXXXX格式(Unicode字符)
$hex = substr($string, $i + 2, 4);
$unescaped .= html_entity_decode('&#x' . $hex . ';', ENT_QUOTES, 'UTF-8');
$i += 6;
} else {
// 处理%XX格式(ASCII字符)
$hex = substr($string, $i + 1, 2);
$unescaped .= chr(hexdec($hex));
$i += 3;
}
} else {
// 普通字符直接保留
$unescaped .= $char;
$i++;
}
}
return $unescaped;
}
代码解析
- 遍历字符串,检测符号以识别编码部分。
- 如果是
%uXXXX格式,提取Unicode十六进制值并转换为字符。 - 如果是
%XX格式,提取ASCII十六进制值并转换为字符。 - 其他字符直接保留。
完整示例与测试
以下是一个完整的示例,展示如何使用上述函数:
$original = "Hello, 世界! This is a test."; $escaped = js_escape($original); $unescaped = js_unescape($escaped); echo "原始字符串: " . $original . "\n"; echo "编码后: " . $escaped . "\n"; echo "解码后: " . $unescaped . "\n";
输出结果
原始字符串: Hello, 世界! This is a test.
编码后: Hello, %u4E16%u754C!%20This%20is%20a%20test.
解码后: Hello, 世界! This is a test.
注意事项
- 编码一致性:确保PHP和JavaScript的编码方式一致(如UTF-8)。
- 性能优化:对于大字符串,可以考虑使用正则表达式优化性能。
- 替代方案:如果项目允许,建议使用
encodeURIComponent和decodeURIComponent,因为它们更符合现代标准。
相关问答FAQs
Q1: 为什么PHP没有内置的escape和unescape函数?
A1: PHP和JavaScript的设计目标不同,JavaScript的escape和unescape主要用于浏览器环境,而PHP主要用于服务器端处理,PHP提供了其他编码函数(如urlencode和urldecode),但为了兼容JavaScript的编码方式,需要手动实现。

Q2: 如何在PHP中正确处理Unicode字符?
A2: 在PHP中处理Unicode字符时,确保文件编码为UTF-8,并使用mbstring扩展函数(如mb_convert_encoding)进行转换,使用html_entity_decode可以正确还原%uXXXX格式的Unicode编码。