Punycode (codipuny, en anglès, petit, insignificant) és una sintaxi de codificació usada en programació per a representar una cadenaUnicode utilitzant només caràcters del jocASCII bàsic i, per tant, és compatible amb elDNS. Punycode està pensat per a la codificació d'etiquetes en el marc d'IDNA (inicials denoms de dominis internacionalitzats en anglès). La sintaxi està definida en eldocumentRFC 3492.[1]
Està secció demostra el procediment per a la codificació Punycode mostrant com la cadena "bücher" (llibres, en alemany) es converteix en "bcher-kva".
Primer es copien tots els caràctersASCII directament des de l'entrada a la sortida saltant els altres caràcters (per exemple: "bücher" → "bcher"). Si s'ha copiat algun caràcter dels bàsics, s'afegeix un guió en ASCII al final de la cadena (és a dir: "bücher" → "bcher-"). El guió, que és un caràcter bàsic pot aparèixer a la cadena abans d'aquest guió addicional, però això no provoca ambigüitat: no hi ha cap fase posterior del procés que n'afegeixi cap més i, per tant, l'últim guió (si n'hi ha) sempre és el que marca el final dels caràcters bàsics.
Per entendre la part següent del procés de codificació necessitem comprendre primer com funciona eldescodificador, el mateix és unamàquina d'estat amb dues variables d'estat,i in.i és un índex dins del rang de la cadena que pot anar des de zero (per representar una possible inserció al començament) fins a la longitud actual de la cadena estesa (per representar una possible 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 unafunció monòtona. Quan hi ha un canvi d'estat, s'incrementai, o bé si ja està en el valor màxim el reseteja a "0" i incrementa "n". A cada canvi d'estat, el punt de codi assenyalat per "n" s'insereix o no.
Els nombres de codi generats pel codificador representen quantes possibilitats s'ha de saltar el descodificador abans de fer una inserció. "ü" correspon al punt de codi 252. Per tant, abans que tinguem la possibilitat d'inserir ü a la posició 1, cal saltar sis ("bcher" té cinc caràcters i, per tant, s'hi poden inserir caràcters en sis posicions diferents) insercions possibles dels 124 punts de codi no-ASCII precedents (124 = 252 − 128, el límit superior d'ASCII) i una inserció possible (la de la posició zero) del punt de codi 252. Per això cal dir-li al descodificador que se salti un total de (6 × 124) + 1 = 745 insercions possibles abans d'arribar a la que cal.
Punycode usasencers de longitud variable generalitzats per representar aquests valors. Per exemple, el codi numèric es representa com a "kva":
Per descodificar aquesta cadena de dígits, el llindar comença com a 1 i el pes és d'1. El primerdí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 (1), per tant 35. Per tant, la suma dels dos primers dígits és de 10 × 1 + 21 × 35. Com que el segon "dígit" no és menor que el valor llindar de 2, encara en queda. El pes del tercer dígit és el pes anterior, multiplicat per 36 menys el nou valor llindar, és a dir 35 × 34. El tercer dígit en aquest exemple és 0, que és inferior al 2, el que significa que és l'últim dígit (i el més significatiu) del nombre. Per tant, "kva" representa el nombre 10 × 1 + 21 × 35 + 0 × 35 × 34 = 745.
El llindar el determina un algorisme que el manté sempre entre 1 i 26 (ambdós inclusius). Això garanteix que l'últim caràcter d'una codificació sigui sempre alfabètic. Llavors es pot utilitzar en majúscula o minúscula, per donar informació sobre la capitalització del caràcter original.
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". "übücher" seria "bcher-jvab".
Per a mantenir la simplicitat dels algorismes de codificació i descodificació, no s'ha previst que s'impedeixi de codificar valors Unicode inadmissibles: però, aquests han de ser controlats i detectats durant la descodificació.
Compareu l'ASCII 'Punycode' presentat axn--tdali-d8a8w.lv que inclou la representació Unicode de la cadena escrita en idiomaletó "amb una u macron", i amb "ena trencada ", en lloc de la base de caràcters sense marcar:tūdaliņ.lv
Punycode està dissenyat per treballar amb tots els sistemes d'escriptura, i per autooptimitzar-se, tractant d'adaptar-se als rangs del joc de caràcters utilitzat a la cadena mentre va funcionant. Està optimitzat per al cas que la cadena es compongui de zero o més caràcters ASCII i a més caràcters de només un altre sistema d'escriptura, però pot codificar qualsevol cadena arbitrària Unicode. Tingueu en compte que per al cas delDNS, la cadena del nom de domini se suposa que ha estat normalitzada utilitzantNameprep i (per alsdominis de primer nivell) filtrada amb una taula d'idioma registrada oficialment abans de passar-se a Punycode, i que el protocol DNS fixa límits en les longituds acceptables de la cadena Punycode de sortida.