Escape completo di una stringa ASCII con Javascript o PHP

… ovvero come convertire caratteri ASCII in codici esadecimali con Javascript o PHP

Le funzioni escape o encodeURIcomponent di Javascript e le funzioni urlencode o rawurlencode di PHP fanno un escape di alcuni caratteri speciali.

Ad esempio la stringa http://www.asciitable.com passata in una di queste funzioni diventerebbe qualcosa tipo http%3A%2F%2Fwww.asciitable.com.

L’escape di un carattere non è altro che il suo corrispondente esadecimale preceduto da un “%”. Per i 255 caratteri ASCII si fa quindi riferimento a questa tabella (che contiene solo i primi 127, per gli altri potete seguire il link dopo l’immagine):

Tabelle ASCII
Tabella ASCII: www.asciitable.com

Se il carattere slash “/”, nella tabella ASCII, corrisponde al numero decimale 47 ed al numero esadecimale 2F, il suo escape sarà %2F.

Anche se le succitate funzioni convertono solo alcuni caratteri, non significa che tutti gli altri non possano essere convertiti.

Per fare l’escape completo di una stringa, quindi, non ci resta che individuare il valore decimale di ogni carattere, convertirlo in numero esadecimale (a larghezza fissa di due cifre) e farlo precedere da un “%”.

Per le stringhe di caratteri ASCII sia Javascript che PHP ci vengono in aiuto con alcune funzioni per la conversione dei caratteri nel loro valore decimale all’interno della tabella ASCII, quindi una volta ottenuto il valore decimale, ci basta convertirlo in esadecimale trasformandolo da numero in base dieci a numero in base 16.

Di seguito il codice pronto per il copia e incolla in Javascript:

function escapeAll(string){
	var hex='';
	for(i=0;i<string.length;i++){
		hex+='%'+strPadLeft(string.charCodeAt(i).toString(16),2);
	}
	return hex.toUpperCase();
}
function strPadLeft(n,l){
	while(n.length<l){
		n='0'+n;
	}
	return n;
}

Nella funzione escapeAll, per ottenere il codice ASCI di ogni carattere, si utilizza charCodeAt. Di seguito un esempio per chiarirne l’utilizzo:

var string = "Hello World";
string.charCodeAt(0); // Ritorna il codice ASCII (decimale) di "H"
string.charCodeAt(1); // Ritorna il codice ASCII (decimale) di "e"
string.charCodeAt(2); // Ritorna il codice ASCII (decimale) di "l"
string.charCodeAt(3); // Ritorna il codice ASCII (decimale) di "l"
string.charCodeAt(3); // Ritorna il codice ASCII (decimale) di "o"
...

Una volta ottenuto il codice ASCII (un numero decimale) dobbiamo quindi trasformarlo in numero esadecimale (che è un numero in base 16). Per cambiare base ad un numero decimale viene utilizzata la funzione toString. Di seguito un esempio:

var num = 16;
while(num--){
	document.write(num.toString(16));
}

Lo script stamperà i numeri compresi dal 15 allo zero in base 16 (esadecimali):

f
e
d
c
b
a
9
8
7
6
5
4
3
2
1
0

Per il resto niente da dire, c’è solo in più una funzione strPadLeft che viene utilizzata per assicurarsi che il codice esadecimale del carattere sia lungo 2 cifre, nel caso sia più corto aggiunge uno zero di riempimento a sinistra del numero (in pratica se gli passiamo F, ritorna 0F).

Di seguito il codice in PHP per ottenere lo stesso risultato (l’escape di una stringa):

function rawstringencode($string){
   $hex = '';

   for($i = 0, $j = strlen($string); $i < $j; $i++)
      $hex .= '%'.str_pad(base_convert(ord($string[$i]), 10, 16), 2, '0', STR_PAD_LEFT);

   return strtoupper($hex);
}

Lo script PHP fa la stessa identica cosa di quello in Javascript, le uniche differenze sono i nomi delle funzioni ed il fatto che si usano in modo leggermente diverso.

Applicazioni

Alcune possibili applicazioni potrebbero essere l’offuscamento di codice Javascript oppure la criptazione di stringhe. Ecco due semplici esempi:

Un alert in Javascript:

<script>eval(unescape('%61%6C%65%72%74%28%22%68%65%6C%6C%6F%20%77%6F%72%6C%64%22%29'));</script>

Una criptazione in Javascript che esegue una semplice operazione aritmetica con il codice ASCII del carattere:

function simpleEncrypt(string){
	var new_string='';
	for(var i=0;i<string.length;i++){
		new_string += String.fromCharCode(255-string.charCodeAt(i));
	}
	return new_string;
}
function simpleDecrypt(string){
	return simpleEncrypt(string);
}

In un prossimo post le funzioni per la conversione ASCII binario, binario ASCII, ma più o meno è la stessa cosa :-)

Per approfondire:

Alcuni link più o meno a tema:

Hai trovato interessante questo articolo? Se vuoi, inscrivendoti alla newsletter, puoi ricevere una notifica ogni volta che c'è un nuovo articolo da leggere, oppure puoi sottoscrivere il feed RSS. Se non sai cos'è puoi leggere: Cos'è e come si legge un feed.
di Francesco Terenzani, 25 May 2008

post<li>

tag: , , .

post correlati:


Commenti (2). Commenti in formato RSS

  1. SERGIO scrive:

    Comlimenti per l’articolo, ma volevo sapere come si fa ad effettuare la procedura inversa, cioè convertire una stringa fatta in questo modo “http%3A%2F%2Fwww.asciitable.com” in stringa normale ?

  2. Fra_T scrive:

    Ciao Sergio,
    basta usare la funzione unescape o decodeURIcomponent in Javascript, oppure urldecode o rawurldecode in PHP :-)

Scrivi un commento

XHTML: Puoi usare questi tag XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>