Punycode: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: fix citazione web (v. discussione) |
m corretti errori grammaticali e fatti piccoli cambiamenti per migliorare la leggibilità del wikicodice |
||
Riga 2:
'''Punycode''' è un sistema di [[Codifica di caratteri|codifica]] definito nella [[Request for Comments|RFC]] [[RFC:3492|3492]] che serve a rappresentare univocamente una sequenza di caratteri [[unicode]] tramite una sequenza di caratteri [[ASCII]], per rendere possibile l'uso di tali sequenze nei [[Domain Name System#Nomi DNS|nomi di dominio]], senza dover modificare infrastrutture e standard esistenti. In questo modo si possono gestire [[nome di dominio internazionalizzato|nomi di dominio internazionalizzati]] ([[RFC:3490|IDNA]]) aggiungendo all'inizio della stringa punycode i caratteri 'xn--'.
La traduzione di sequenze Punycode nella codifica originaria è a carico
== Algoritmo di base ==
L'algoritmo non è semplicissimo, tuttavia può essere ricondotto a operazioni di base elementari, oltre ad essere facilmente implementabile e versatile. Gli elementi principali sono i seguenti:
* Dapprima vengono inseriti, così come compaiono, i caratteri
* Tali caratteri sono seguiti da un trattino e da una serie di caratteri alfanumerici che rappresentano la [[trascodifica]] vera e propria dei simboli unicode non ASCII in punycode.
Un esempio può essere dato da ''totò'' trascodificato in ''tot-ena''.
Per capire il cuore dell'algoritmo dovremo soffermarci sul terzo punto. La sequenza alfanumerica dopo quel trattino solitario in realtà rappresenta uno o più numeri, chiamati delta, ognuno associato alla presenza di un carattere
Nel caso in questione, ad esempio, la stringa ''ena'' rappresenta la presenza della ò in 4ª posizione, ma a causa dell'algoritmo usato (in cui entrano in gioco la lunghezza della stringa, i caratteri già inseriti, e altri parametri) potrebbe significare anche un altro codice unicode in un'altra posizione.
=== Delta ===
Soffermandoci adesso sul singolo delta, esso:
* Rappresenta un numero in [[notazione]] 36esimale (lettere a-z e numeri 0-9) con talune particolarità.
* Il numero è [[little endian]], ovverosia con la cifra meno significativa a sinistra.
* Vi sono alcuni caratteri che, oltre ad avere un proprio valore numerico, segnano allo stesso tempo la fine del delta (e l'eventuale inizio di un altro)
Riga 23:
** la presenza di tali caratteri si riflette nel motivo per cui il peso di una data cifra non sarà data semplicemente dalla formula base^n, ma a volte alla [[base numerica|base]] occorre sottrarre i cosiddetti threshold, ovverosia il numero di possibili marcatori di fine delta.
Inoltre, cosa più importante, il delta rappresenta contemporaneamente sia il codice
Inoltre, dato <n,i> un particolare stato dove n è il codice di un carattere da inserire (anzi, lo scostamento rispetto ad un valore base) e i è la posizione di inserimento, i è vincolato a crescere fino alla lunghezza complessiva della stringa, per poi tornare a 0 e incrementare n di 1; dato i=0, la sequenza degli stati sarà simile a questa:
Riga 30:
In pratica, dato un certo delta, dividendolo per la lunghezza della stringa base +1, si ottiene come resto la posizione in cui inserire il carattere unicode (posizione che varia da 0 (inizio) a L (fine)), e come quoziente lo scostamento del valore unicode rispetto a un valore base (fissato inizialmente, per comodità, a 128).
=== Threshold ===
I threshold sono calcolati [[digit]] per digit e rappresentano all'interno di ognuno di questi il numero di possibili caratteri-segnalatori della fine del delta, a partire da quello con valore più basso, la 'a' appunto. In particolare per calcolare il threshold di un singolo digit si avrà la formula:
t(j)=base*(j+1)-bias
Riga 43:
Detto in forma più comprensibile, il peso di ogni digit non sarà semplicemente la base^j bensì (base-t(0))*(base-t(1))....*(base-t(n))
=== Iterazioni ===
Ogni codifica di un delta successivo occorre:
* Dividere il valore del delta per 2 (tranne la prima volta che si divide per 700).
Riga 50:
* let bias = (base * the number of divisions performed in step 3) + (((base - tmin + 1) * delta) div (delta + skew))
=== Esempi ===
Tornando al nostro totò (tot-ena) sarà facile adesso capire che per mettere la o accentata nella posizione precedente (toòt) basterà sottrarre al delta 1, e ricordando che esso è little-endian si deve modificare la sua prima lettera (e), ovverosia: (tot-dna).
Riga 58:
Ritornando ora a totò, con codifica tot-ena, se vogliamo aggiungere uno ''stato'' al delta, siccome abbiamo già raggiunto la fine della stringa, il carattere unicode assumerà il valore successivo (la o accentata al contrario ó) e l'indice i si azzererà come previsto, ponendosi all'inizio. ótot avrà insomma codifica tot-fna ('f'='e'+1)
== Voci correlate ==
* [[Unicode]]
* [[Browser]]
== Collegamenti esterni ==
* {{cita web|http://mct.verisign-grs.com/|Convertitore Punycode di Verisign}}
|