LINUX.ORG.RU

[JS]Если ли разница между decodeURI и decodeURIComponent?

 


0

0

Из описания этих функций совершенно не видно какой-либо разницы. Несколько простых тестов тоже не позволили её определить. Она реально есть или их поведение совершенно идентично?

★★★

Ответ на: комментарий от vga

> https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functio...

А где же еще можно ртфмить?


Ну и при чём тут дока на encodeURI? разве я о ней спрашиваю? Это я конечно всё внимательно читал, после чего вопрос и возник. Я спрашиваю о разнице между https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functio... и https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functio...

archimag ★★★
() автор топика
Ответ на: комментарий от archimag

Там же написано, одна делает обратное encodeURI, а другая обратное encodeURICompoment. А в доках по encodeXXX написано, что они делают. Причем в See also указаны encodeXXX, и на самих encodeXXX в тексте ссылка есть. Я уж даже и не знаю, что там еще написать надо, чтобы таки кликнули по этим ссылкам.

vga ★★
()

Mozilla не нужна.

anonymous
()
Ответ на: комментарий от vga

> Я уж даже и не знаю, что там еще написать надо,

чтобы таки кликнули по этим ссылкам.


Я уже два раза сказал, что читал это, и не только это, и не один раз. Вы сами то читали? encodeURI и encodeURIComponent отличаются набором символов, которые они оставляют в изначальном виде, encodeURI не кодирует ~!@#$&*()=:/,;?+', а encodeURIComponent не кодирует ~!*()'. Вот и все различия. Только для обратной операции, которыми являются decodeURI и decodeURIComponent, это не имеет никакого значения. Вот я и спрашиваю, есть ли между ними какая разница?

archimag ★★★
() автор топика
Ответ на: комментарий от archimag

Не совсем понял, почему не имеет значения для обратной.

uriReserved ::: one of
       ; / ? : @ & = + $ ,

When the decodeURI function is called with one argument encodedURI, the following steps are taken:
1. Let uriString be ToString(encodedURI).
2. Let reservedURISet be a String containing one instance of each character valid in uriReserved plus “#”.
3. Return the result of calling Decode(uriString, reservedURISet)


When the decodeURIComponent function is called with one argument encodedURIComponent, the following
steps are taken:
1.  Let componentString be ToString(encodedURIComponent).
2.  Let reservedURIComponentSet be the empty String.
3.  Return the result of calling Decode(componentString, reservedURIComponentSet)

как раз вот на reserved и отличаются.

У мозиллы тупо по спеке все и сделано, вот


const jschar js_uriReservedPlusPound_ucstr[] =
    {';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '#', 0};


static JSBool
str_decodeURI(JSContext *cx, uintN argc, jsval *vp)
{
    JSString *str;

    str = ArgToRootedString(cx, argc, vp, 0);
    if (!str)
        return JS_FALSE;
    return Decode(cx, str, js_uriReservedPlusPound_ucstr, vp);
}

static JSBool
str_decodeURI_Component(JSContext *cx, uintN argc, jsval *vp)
{
    JSString *str;

    str = ArgToRootedString(cx, argc, vp, 0);
    if (!str)
        return JS_FALSE;
    return Decode(cx, str, js_empty_ucstr, vp);
}

Ну или если по исходной доке, то там тоже написано по decodeURI - Does not decode escape sequences that could not have been introduced by encodeURI. А по decodeURIComponent такого не написано, и по коду это тоже видно.

vga ★★
()
Ответ на: комментарий от vga

> как раз вот на reserved и отличаются.

Ну и как это влияет на процесс декодирования? Что там в reserved важно для процесса кодирования, но как этот список может использоваться при декодировании? Что такое кодированная строка представляете? Можете привести пример строки, для которой decodeURL и decodeURLComponent давали бы разные результаты?

archimag ★★★
() автор топика
Ответ на: комментарий от archimag

Как влияет - смотри функцию Decode, либо в спеке, либо в исходниках мозиллы. Она слегка большая, чтобы ее сюда тащить.

Пример - легко.

var str='http://www.linux.org.ru/forum/web-development/4676334?lastmod=1269123086894#3';

var encoded=encodeURIComponent(str);
print(encoded + "\n")

var decoded1=decodeURI(encoded);
print(decoded1 + "\n")

var decoded2=decodeURIComponent(encoded);
print(decoded2 + "\n")

Результат
http%3A%2F%2Fwww.linux.org.ru%2Fforum%2Fweb-development%2F4676334%3Flastmod%3D1269123086894%233
http%3A%2F%2Fwww.linux.org.ru%2Fforum%2Fweb-development%2F4676334%3Flastmod%3D1269123086894%233
http://www.linux.org.ru/forum/web-development/4676334?lastmod=1269123086894#3
vga ★★
()
Ответ на: комментарий от vga

О, теперь уже лучше. Правда, какого-либо практического смысла в подобной работе decodeURL не вижу, но это уже другой вопрос.

archimag ★★★
() автор топика
Ответ на: комментарий от archimag

Что лучше? Я же сделал именно то, что написано в доке. Или лучше в том смысле, что ты наконец-то понял, как влияет на decode reserved?

vga ★★
()
Ответ на: комментарий от vga

> Или лучше в том смысле, что ты наконец-то понял,

как влияет на decode reserved?


Лучше в том смысле, что был показан код, демонстрирующий отличия :) Дело в том, что мне надо реализовать (точнее, я его уже реализовал) соответствующий функционал для серверной стороны и я был в сомнениях: нужна одна функция или таки две. Из приведённого примера я пока делаю вывод, что будет достаточно одной функции. Спаибо :)

archimag ★★★
() автор топика
Ответ на: комментарий от archimag

вод пидите пацаны, а мы то все лохи оказывается. достаточно одной.

trashymichael ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.