PHP的urldecode和AS3的unescape的区别?

Differences between PHP's urldecode and AS3's unescape?

PHP 使用 urlencode 和 urldecode 而 Actionscript 3 使用 escape 和 unescape 将字符串编码和解码为 URL 安全格式,但问题是显然它们不完全是相同的。当我尝试在 PHP 中的字符串上使用 urlencode 然后在 AS3 中取消转义,或者在 AS3 中转义并在 PHP 中转义时,这偶尔会给我带来问题。有谁知道确切的区别是什么?我发现 this post 其中列出了以下差异:

**PHP urlencode**
á=%E1
é=%E9
í=%ED
ñ=%F1

**AS3 escape**
á=%C3%A1
é=%C3%A9
í=%C3%AD
ñ=%C3%B1

还有更多不同吗? PHP 的官方文档和 AS3 的文档都没有列出哪些字符被编码成什么。

好吧,我做了一些测试,差异很大,即使只是字符代码 0 到 255。这是我的测试代码:

**AS3**
for (var i:uint=0; i<=255; i++) {
    var s:String = String.fromCharCode(i);
    trace(i + ": " + escape(s));
}

**PHP**
for ($i=0; $i<=255; $i++) {
    $s = chr($i);
    echo $i . ': ' . urlencode($s);
    echo "\n";
}

对比输出后,有以下不同:

char code 32 ( )
AS3 escape: %20
PHP urlencode: +

char code 42 (*)
AS3 escape: *
PHP urlencode: %2A

char code 43 (+)
AS3 escape: +
PHP urlencode: %2B

char code 47 (/)
AS3 escape: /
PHP urlencode: %2F

char code 64 (@)
AS3 escape: @
PHP urlencode: %40

PHP 也有 rawurlencode,它将 space 变成 %20 而不是 + 号,但所有其他差异仍然存在。除了字符代码 255 之外,AS3 在事物前面添加了一个额外的 %u01,这在 urlencode 中是不存在的。

此外,似乎 AS3 确实有办法 URL-encode 与 PHP 期望的方式相同,但您无法正常访问它。

var symbols:String = " *+/@";
var vars:URLVariables = new URLVariables();
vars.param1 = symbols;
trace(vars.toString()); // param1=%20%2A%2B%2F%40 <--- This is the same as PHP
trace(escape(symbols)); // %20*+/@                     but not this
trace(encodeURI(symbols)); // %20*+/@                  or this
trace(encodeURIComponent(symbols)); // %20*%2B%2F%40   or this