2010-03-29 3 views
6

Я использую этот плагин jQuery urlencode и urldecode - очень простой и простой в использовании, но в исходной форме он не удаляет + из строки. В одном комментарии на домашней странице предлагается патч, но я не знаю, как его реализовать. Может кто-нибудь мне помочь?jQuery urlencode/decode patch help

страницу: http://www.digitalbart.com/jquery-and-urlencode/

//URL Encode/Decode 
$.extend({URLEncode:function(c){var o='';var x=0;c=c.toString(); 
var r=/(^[a-zA-Z0-9_.]*)/; 
    while(x<c.length){var m=r.exec(c.substr(x)); 
    if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length; 
    }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16); 
    o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;}, 
URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/; 
    while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){ 
    b=parseInt(m[1].substr(1),16); 
    t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;} 
}); 

Предлагаемый патч:

function dummy_url_decode(url) { 
// fixed -- + char decodes to space char 
var o = url; 
var binVal, t, b; 
var r = /(%[^%]{2}|\+)/; 
while ((m = r.exec(o)) != null && m.length > 1 && m[1] != '') { 
if (m[1] == '+') { 
t = ' '; 
} else { 
b = parseInt(m[1].substr(1), 16); 
t = String.fromCharCode(b); 
} 
o = o.replace(m[1], t); 
} 
return o; 
} 

Спасибо!

+6

Как это отличается от 'encodeURIComponent()'? – jholster

ответ

34

Не используйте этот плагин вообще; это бессмысленно. Javascript уже поддерживает кодирование и декодирование URL со встроенными функциями (encodeURIComponent и decodeURIComponent). Пространства кодируются как% 20 с помощью этого механизма.

Если ваш код на стороне сервера помещает знаки плюс для пробелов, вы можете избавиться от них с простой заменой регулярных выражений, так как не будет никаких «реальных» плюсовых знаков, о которых нужно беспокоиться (они закодированы как % 2B):

var decoded = decodeURIComponent(encoded.replace(/\+/g, '%20')); 
+0

Как обрабатываются '+' при декодировании, если строка была закодирована с помощью PHP? – jay

+0

См. Edit; Я просто исправлю их перед расшифровкой. – Pointy

+0

Отличный @Pointy. Это сделал трюк. По какой причине это не в API jQuery? – jay