Различия между urldecode PHP и unescape AS3? - PullRequest
0 голосов
/ 30 января 2020

PHP использует urlencode и urldecode, в то время как Actionscript 3 использует escape и unescape для кодирования и декодирования строк в URL-безопасный формат, но проблема в том, что, очевидно, они не совсем совпадают. Это иногда вызывает у меня проблемы, когда я пытаюсь использовать urlencode для строки в PHP, а затем удалить ее в AS3 или экранировать в AS3 и urldecode в PHP. Кто-нибудь знает, каковы точные различия? Я нашел этот пост , в котором перечислены следующие различия:

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

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

Есть ли еще различия? Ни в официальной документации для PHP, ни в документации для AS3 не указано, какие символы зашифрованы во что.

1 Ответ

2 голосов
/ 31 января 2020

Я провел некоторое тестирование, и различия существенны, даже для кодов символов от 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, что превращает пробел в% 20 вместо знака +, но все остальные различия остаются. Помимо символьного кода 255, AS3 добавляет дополнительный% u01 перед вещами, которых нет в urlencode.

Кроме того, кажется, что AS3 действительно имеет способ кодирования URL таким же образом, как 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
...