Punycode

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Unicode
Codificări
UCS
Cartografiere
Text bidirecțional
BOM
Unificarea Han
Unicode și HTML

Punycode este un sistem de codificare definit în RFC 3492 care servește pentru a reprezenta în mod unic o secvență de caractere unicode printr-o secvență de caractere ASCII , pentru a face posibilă utilizarea acestor secvențe în nume de domenii , fără a fi nevoie să modificați infrastructurile și standardele existente. În acest fel, este posibil să gestionați numele de domenii internaționalizate ( IDNA ) prin adăugarea caracterelor „xn--” la începutul șirului de coduri de cod.

Traducerea secvențelor Punycode în codificarea originală este responsabilitatea agentului utilizator .

Algoritm de bază

Algoritmul nu este foarte simplu, cu toate acestea poate fi urmărit înapoi la operațiuni elementare de bază, precum și ușor de implementat și versatil. Principalele elemente sunt următoarele:

  • În primul rând, caracterele ASCII standard sunt introduse pe măsură ce apar.
  • Aceste caractere sunt urmate de o cratimă și o serie de caractere alfanumerice care reprezintă transcodarea reală a simbolurilor unicode non-ASCII în cod de cod.

Un exemplu poate fi dat de totò transcodificat în tot-ena .

Pentru a înțelege nucleul algoritmului va trebui să ne concentrăm asupra celui de-al treilea punct. Secvența alfanumerică după liniuța singură reprezintă de fapt unul sau mai multe numere, numite delte, fiecare asociat cu prezența unui caracter Unicode în șir. Ordinea deltelor introduse urmează cea a codurilor Unicode și nu cea a poziției caracterelor din șirul inițial.

În cazul în cauză, de exemplu, șirul ena reprezintă prezența ò în poziția a 4-a, dar datorită algoritmului utilizat (în care intră în joc lungimea șirului, caracterele deja introduse și alți parametri) ar putea însemna și un alt cod unicode în altă locație.

Delta

Locuind acum pe singura deltă, ea:

  • Reprezintă un număr în notația 36 (litere az și cifre 0-9) cu unele particularități. Literele alfabetului (minuscule sau majuscule) reprezintă, în ordine alfabetică, numerele de la 0 la 25, în timp ce cifrele 0-9 reprezintă numerele de la 26 la 35.
  • Numărul este puțin endian , adică cu cea mai puțin semnificativă cifră din stânga.
  • Există câteva caractere care, pe lângă faptul că au propria lor valoare numerică, marchează în același timp sfârșitul deltei (și posibilul început al altuia)
    • numărul de caractere care pot acționa ca marcatori variază în timpul algoritmului și, în orice caz, includ toate caracterele cu o valoare mai mică decât una dată.
    • prezența unor astfel de caractere se reflectă în motivul pentru care greutatea unei figuri date nu va fi dată pur și simplu de formula de bază ^ n, ci uneori așa-numitele praguri trebuie să fie scăzute din bază , adică numărul posibilelor markeri de delta.

Mai mult, mai important, delta reprezintă atât codul Unicode care trebuie inserat în șirul ASCII, cât și poziția acestuia în același timp.

Mai mult, având în vedere <n, i> o stare specială în care n este codul unui caracter de inserat (într-adevăr, abaterea de la o valoare de bază) și i este poziția de inserție, i este obligat să crească până la lungimea totală a șirul, apoi reveniți la 0 și creșteți n cu 1; dat fiind i = 0, succesiunea stărilor va arăta astfel: <n, i>, <n, i + 1> .... <n, L>, <n + 1, i>, <n + 1, i + 1> ..... Valoarea numerică a deltei este definită ca numărul de stări anterioare unei stări de armare.

În practică, având în vedere o anumită deltă, împărțind-o la lungimea șirului de bază +1, obținem ca rest poziția în care se introduce caracterul unicode (poziție care variază de la 0 (început) la L (sfârșit)), și, ca un coeficient, este abaterea valorii unicode de la o valoare de bază (setată inițial, pentru comoditate, la 128).

Prag

Pragurile sunt calculate cifră cu cifră și reprezintă în fiecare dintre acestea numărul de caractere de semnalizare posibile de la sfârșitul deltei, începând de la cel cu cea mai mică valoare, „a”. În special, pentru a calcula pragul unei singure cifre vom avea formula: t (j) = bază * (j + 1) -bias

unde j este numărul de cifre considerat (începând de la 0), baza este exact 36, iar polarizarea este o valoare care este setată inițial la 72, dar care se modifică ulterior la trecerea de la o deltă la alta pe baza unei anumite formule. t (j) este, de asemenea, constrâns să fie inclus între un tmin = 1 și un tmax = 26. Pentru a realiza acest lucru, dacă din anumite motive t (j) scade sub tmin, se plasează t (j) = tmin și dacă t (j) depășește tmax, se va plasa t (j) = tmax

Mai mult, deoarece caracterele sunt definite de pragurile de semnalizare, ele influențează și indirect greutatea fiecărei cifre, calculată cu următoarea formulă:

  • w (0) = 1 (greutatea primei cifre)
  • w (j) = w (j-1) * (base-t (j-1)) (pentru j> 0)

Într-o formă mai ușor de înțeles, greutatea fiecărei cifre nu va fi pur și simplu baza ^ j ci (base-t (0)) * (base-t (1)) .... * (base-t (n))

Iteratii

Fiecare codificare a unei delta ulterioare necesită:

  • Împărțiți valoarea delta la 2 (cu excepția primei ori când se împarte la 700).
  • Adăugați la delta, valoarea delta / punctelor numere, unde punctele numere indică numărul de delte deja codificate.
  • while delta> ((base - tmin) * tmax) div 2 do let delta = delta div (base - tmin)
  • let bias = (bază * numărul de diviziuni efectuate la pasul 3) + (((bază - tmin + 1) * delta) div (delta + înclinare))

Exemple

Revenind la totò (tot-ena), acum va fi ușor să înțelegem că pentru a pune accentul o în poziția anterioară (toòt) va fi suficient să scădem din delta 1 și ne amintim că este puțin endian, trebuie să modificați prima literă (e), adică: (tot-dna).

Plasând accentul ò chiar înainte de tòot, transcodarea va fi xn - tot-cna ('c' = 'e'-2) și în cazul òtot, tot-bna (' b '=' e'-3)

Revenind acum la totò, cu codificare tot-ena, dacă dorim să adăugăm o stare la delta, deoarece am ajuns deja la sfârșitul șirului, caracterul unicode va lua următoarea valoare (la o accentuată înapoi ó) și indexul i va fi redus la zero așa cum era de așteptat, începând de la început. ótot va avea codificare tot-fna ('f' = 'e' + 1)

Elemente conexe

linkuri externe