|
Urlencodarea se face pentru a inlocui caracterele permise non URL cu caractere permise URL intr-un sir. Acest lucru se face de obicei cand fie cand parametrii GET trec prin browserul URL, fie cand datele trec prin AJAX. Javascript furnizeaza diverse functii pentru a implementa aceasta functionalitate
escape(string) – Aceasta functie este folosita pentru a siruri. Functia escape() codifica caractere speciale, cu exceptia lui * @ - _ + . /
unescape(string) ar trebui folosita pentru a decodifica sirul (string) codificat de catre functia escape.
De exemplu
var str = "hello34ad#4";
alert(escape(str));
alert(unescape(str));
Te rog ia aminte la faptul ca nu se recomanda sa codifici URI cu escape, ci trebui sa folosim functiile listate mai jos.
encodeURI(string) - Functia encodeURI() codifica un sir ca un URI. Functia encodeURI() codifica caractere speciale, cu exceptia: , / ? : @ & = + $ #. Foloseste functia decodeURI() pentru a decoda URI-urile codificate cu encodeURI().
De exemplu
var str = 'http://www.yahoo.com';
alert(encodeURI(str));
alert(decodeURI(str));
encodeURIComponent(string) - Functia encodeURI() codifica un sir ca o componenta a unui URI. Aceasta functie nu prezinta nici o exceptie. Foloseste functia decodeURIComponent(string) pentru a decodifica URI-ul codificat cu aceasta functie.
Problema cu functiile Javascript Encoding
Desi JavaScript a furnizat numeroase functii de codificare si decodificare url, exista o problema inerenta tuturor acestora, anume ca nu sunt compatibile cu functiile PHP urlencode si urldecode.
Aceasta problema devine in special un inconvenient atunci cand folosim ajax ca punte de comunicare intre JavaScript si PHP. Functiile standard JavaScript opereaza usor diferit: ele codifica spatiul ca "%20", si trateaza "+" ca si caracter permis. Totusi, putem scrie o functie JavaScript care sa regleze aceasta problema. Cele doua functii date mai jos pot codifica si decodifica URL-ul intr-o maniera similara analoagelor lor PHP.
function URLEncode(url){
var SAFECHARS = "0123456789" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"-_.!~*'()";
var HEX = "0123456789ABCDEF";
var plaintext = url;
var encoded = "";
for (var i = 0; i < plaintext.length; i++ ) {
var ch = plaintext.charAt(i);
if (ch == " ") {
encoded += "+";
} else if (SAFECHARS.indexOf(ch) != -1) {
encoded += ch;
} else {
var charCode = ch.charCodeAt(0);
if (charCode > 255) {
alert( "Unicode Character '" + ch
+ "' cannot be encoded using standard URL encoding.\n"
+ "(URL encoding only supports 8-bit characters.)\n"
+ "A space (+) will be substituted." );
encoded += "+";
} else {
encoded += "%";
encoded += HEX.charAt((charCode >> 4) & 0xF);
encoded += HEX.charAt(charCode & 0xF);
}
}
}
return encoded;
}
function URLDecode(url){
var HEXCHARS = "0123456789ABCDEFabcdef";
var encoded = url;
var plaintext = "";
var i = 0;
while (i < encoded.length) {
var ch = encoded.charAt(i);
if (ch == "+") {
plaintext += " ";
i++;
} else if (ch == "%") {
if (i < (encoded.length-2)
&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
plaintext += unescape( encoded.substr(i,3) );
i += 3;
} else {
alert( 'Bad escape combination near ...'
+ encoded.substr(i) );
plaintext += "%[ERROR]";
i++;
}
} else {
plaintext += ch;
i++;
}
}
}
|