… 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):

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:
- Fondamenti di Informatica » Sistemi di numerazione
- PHP and JavaScript encoding comparison table
- JavaScript String Object Reference
- String Funcions di PHP
- La decodifica automatica di semplici javascript offuscati e criptati
- Invio e ricezione di caratteri (Ajax)
tag: ASCII Table, Javascript, PHP.
post correlati:
- Conversione di una stringa da ASCII a binario e da binaro a ASCII con Javascript
- Filtri CSS per Opera browser
- Tracciare link esterni e download con Google Analytics Asincrono
- Trovare la definizione di una funzione in PHP
- Una API per Google Maps in stile jQuery
- Tracciare link esterni e download con Google Analytics
- Sui feed RSS e le date

14 July 2008 alle 12:56
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 ?
14 July 2008 alle 13:32
Ciao Sergio,
basta usare la funzione unescape o decodeURIcomponent in Javascript, oppure urldecode o rawurldecode in PHP :-)