Punycode
Punycode (codi puny) és una sintaxi de codificació usada en programació que utilitza una cadena Unicode que pot ser traduïda en una cadena de caràcters més limitada compatible amb els noms de xarxa. La sintaxi està publicada en Internet en el document RFC 3492.[1] La codificació és usada com a part de IDNA, que és un sistema que habilita l'ús de IDNA (inicials de noms de dominis internacionalitzats en anglès) en tots els fitxer d'ordres suportats per Unicode.
Procediment de codificació
Està secció demostra el procediment per a la codificació Punycode mostrant com la cadena "bücher" és convertit en "bcher-kva".
Separació de caràcters ASCII
Primer són copiats tots els caràcters ASCII són copiats directament des de l'entrada a la sortida saltant sobre altres caràcters (per exemple: "bücher" → "bcher-") També conegut com a "Codi ACE".
- A UTF-8: espanya
- A Punycode: xn - Espanya-rta
Codificació d'inserció de caràcters diferents del ASCII i codis numèrics
Per entendre la part següent del procés de codificació necessitem comprendre primer com funciona el decodificador, el mateix és una màquina d'estat amb dues variables d'estat "i" i "n". "I" és un índex dins del rang de cadena que va des de zero (representant una potencial inserció al començament) fins a la longitud actual de la cadena estesa (representant una eventual inserció al final).
I comença en zero mentre que "n" 'comença a 128 (el primer caràcter NO-ASCII). La progressió de l'estat és monòtona.
Quan un estat canvia s'incrementa "i" o bé si ja està en el valor màxim el reseteja a "0" i incrementa "n". Amb cada canvi d'estat, el punt codi assenyalat per "n" és o no és inserit.
Possibilitats que té un decodificador de saltar els codis numèrics generats pel codificador-decodificador
Si "ü" té codi de punt 252, s'obté la possibilitat d'inserir en la posició un si cal saltar cap a les sis insercions potencials sobre cadascuna dels 124 codis NO-ASCII precedents i una possible inserció (en la posició zero) del punt de codi 252. Això és perquè es necessita dir-li al decodificador que salteu (6 * 24) "1 = 745 insercions possibles després d'obtenir la requerida.
Recodificació de codis numèrics com a seqüències de codis ASCII
Unicode usa sencers de longitud variable per representar aquests valors. Per exemple, això és com "kva" és usat per representar el codi numèric 745. Un sistema numèric amb endianness és usat per permetre codis de longitud variable amb delimitadors separats: un bit més baix que una marca de llindar que és el dígit més significant, per tant el final del número. El valor del llindar depèn de la posició en el nombre i també d'insercions prèvies, per augmentar l'eficiència. Varia corresponentment al pes dels nombres.
Exemple
S'usa un sistema de numeració en base 36, amb els caràcters de la "a" fins a la "z" representat als números 0 a 25 i els caràcters "0" a "9" representant els números 26 a 35, per la qual tant la cadena "kva" es correspondria a "10 21 0" (k = 10, v = 21, a = 0).
Per decodificar aquesta cadena de dígits, el llindar comença com 1 i el pes és d'1. El primer dígit és el de les unitats, 10 amb un pes d'1 és igual a 10. Després d'això, el valor llindar s'ajusta. En nom de la simplicitat, assumim que és ara 2. La segona xifra té un pes de 36 menys el valor llindar anterior, en aquest cas, 35. Per tant, la suma dels dos primers dígits és de 10 × 1+21 × 35. Des del segon "nombre" no sigui inferior al valor límit de 2, hi ha més per venir. El pes del tercer dígit és el pes anterior 36 vegades menys el nou valor llindar, 35 × 34. El tercer dígit en aquest exemple és 0, el que és inferior al 2, el que significa que és l'última (més important) part del nombre. Per tant "kva" representa el nombre 10 × 1+21 × 35+0 × 35 × 34 = 745.
Per a la inserció d'un segon caràcter especial en "bücher", la primera possibilitat és "büücher" amb el codi "bcher-kvaa", el segon "bücüher" amb el codi "bcher-kvab", etc. Després de "bücherü" amb el codi "bcher-kvae" ve "ýbücher" amb el codi "bcher-kvaf", etc
Per a realitzar la codificació i decodificació d'algorismes simples, no s'ha previst que s'impedeixi decodificar valors Unicode inadmissibles: però, aquests han de ser controlats i detectats durant la decodificació.
Comparar l'ASCII 'Punycode' presentat a [1] que inclou la representació Unicode de la cadena escrita en idioma letó "amb una o macron", i "amb ce trencada ", en lloc de la base de caràcters sense marcar: [2]
Requeriments per utilitzar Punycode
Punycode està dissenyat per treballar amb tots els fitxer d'ordres, i de ser autosuficients en l'optimització de tractar d'adaptar al joc de caràcters varia dins de la cadena com els que opera. S'està optimitzant per al cas que la cadena es compon de zero o més caràcters ASCII i més només caràcters d'un altre sistema d'escriptura, sinó de fer front a qualsevol cadena arbitrària Unicode. Tingueu en compte que per utilitzar DNS, el nom de domini cadena se suposa que ha estat normalitzada per utilitzar Nameprep (per als dominis de nivell superior) filtrada amb una taula d'un idioma oficialment registrats abans de ser Punycode, i que el protocol DNS fixa els límits de les longituds acceptables de la cadena Punycode de sortida.
Referències
Enllaços externs (en anglès)
- UTF-8 a Punycode
- RFC 3492 (see also a slightly aclarir 3492bis draft)
- Punycode encoding and decoding
- Punycode converter
- Online Punycode/IDN Decoder/Encoder
- IDN Library-Libidn
- ICU IDNA Demonstration An online Demonstration of how ICU performs IDN operations
- for Domains Convert Unicode to Punycode
- List of TLDs consideri by the Mozilla developers to have an effective anti-spoofing policy for name registration
- IDN and Punycode in IE7
- converter for Korean