Punycode

Punycode er en kodingssyntaks som brukes i programmering som bruker en Unicode -streng som kan oversettes til en mer begrenset tegnstreng som er kompatibel med nettverksnavn. Syntaksen er publisert på Internett i RFC 3492. [ 1 ] Kodingen brukes som en del av IDNA, som er et system som muliggjør bruk av IDNA ( Internationalized Domain Name Initials ) i alle domenenavnfiler.kommandoer støttet av Unicode.

Kodingsprosedyre

Denne delen demonstrerer prosedyren for Punycode-koding ved å vise hvordan strengen "bücher" konverteres til "bcher-kva".

ASCII-tegnseparasjon

Først kopieres alle ASCII- tegn direkte fra inndata til utdata ved å hoppe over andre tegn (for eksempel: “bücher” → “bcher-”) Også kjent som “ACE-kode”.

Innsetting av koding av ikke-ASCII-tegn og numeriske koder

For å forstå neste del av kodingsprosessen må vi først forstå hvordan dekoderen fungerer , det er en tilstandsmaskin med to tilstandsvariabler "i" og "n". "I" er en indeks i strengområdet fra null (representerer en potensiell begynnelsesinnsetting) til den faktiske lengden på den utvidede strengen (representerer en mulig sluttinnsetting).

I starter på null mens "n"' starter på 128 (det første IKKE-ASCII-tegnet). Progresjonen av staten er monoton .

Når en tilstand endres, øker den "i", eller hvis den allerede er på maksimumsverdien, tilbakestiller den den til "0" og øker "n". Med hver endring av tilstand, er kodepunktet indikert med "n" eller ikke satt inn.

Muligheter som en dekoder har til å hoppe over de numeriske kodene generert av enkoder-dekoderen

Hvis "ü" har punktkode 252, får du muligheten til å sette den inn i posisjon én hvis du trenger å hoppe over alle seks potensielle innlegg over hver av de foregående 124 ASCII-kodene og en mulig innsetting (i posisjon null) av punktkode 252 Dette er fordi du må fortelle dekoderen å hoppe over (6*124) + 1 = 745 mulige innlegg etter å ha fått den nødvendige.

Omkoding av numeriske koder som ASCII-kodesekvenser

Unicode bruker heltall med variabel lengde for å representere disse verdiene. Dette er for eksempel hvordan "kva" brukes til å representere tallkoden 745. Et endianness -tallsystem brukes for å tillate koder med variabel lengde med separate skilletegn: en bit lavere enn et terskelmerke som er det mest signifikante sifferet , derav slutten av nummeret. Verdien av terskelen avhenger av posisjonen i tallet og også av tidligere innlegg, for å øke effektiviteten. Det varierer tilsvarende med tallenes vekt.

Eksempel

Et base 36 nummereringssystem brukes, med tegnene fra "a" til "z" som representerer tallene 0 til 25 og tegnene "0" til "9" representerer tallene 26 til 35, så derfor vil strengen "kva" tilsvarer «10 21 0» (k = 10, v =21, a =0).

For å dekode denne sifferstrengen starter terskelen på 1 og vekten er 1. Det første sifferet er enhetssifferet, 10 med vekten 1 er lik 10. Etter dette justeres terskelverdien. For enkelhets skyld, la oss anta at det nå er 2. Det andre sifferet har en vekt på 36 minus forrige terskelverdi, i dette tilfellet 35. Derfor er summen av de to første sifrene 10 × 1 + 21 × 35. Så lenge det andre "tallet" ikke er mindre enn grenseverdien på 2, er det mer som kommer. Vekten til det tredje sifferet er den forrige vekten 36 ganger minus den nye terskelverdien, 35 × 34. Det tredje sifferet i dette eksemplet er 0, som er mindre enn 2, noe som betyr at det er den siste (viktigste) delen av tallet . Derfor representerer "kva" tallet 10 × 1 + 21 × 35 + 0 × 35 × 34 = 745.

For å sette inn et andre spesialtegn i "bücher", er den første muligheten "büücher" med koden "bcher-kvaa", den andre "bücüher" med koden "bcher-kvab", etc. Etter «bücherü» med koden «bcher-kvae» kommer «ýbücher» med koden «bcher-kvaf» osv.

For å utføre enkle kodings- og dekodingsalgoritmer, er det ingen bestemmelse som forhindrer ulovlige UNICODE-verdier fra å dekodes: de må imidlertid kontrolleres og oppdages under dekoding.

Sammenlign ASCII 'punycoded' presentert på http://xn--tdali-d8a8w.lv/ som inkluderer Unicode-representasjonen av strengen skrevet på det latviske språket med en " u med macrón ", og " n med cedilla ", i stedet fra den umerkede tegnbasen http://tūdaliņ.lv

Krav for å bruke Punycode

Punycode er designet for å fungere med alle skript , og fra å være selvforsynt med optimalisering til å prøve å tilpasse tegnsettet varierer innenfor kjeden mens det fungerer. Det er optimalisering for tilfellet der strengen består av null eller flere ASCII-tegn pluss kun tegn fra et annet skript, men vil håndtere enhver vilkårlig Unicode-streng. Merk at for å bruke DNS , antas domenenavnstrengen å ha blitt normalisert til å bruke Nameprep (for toppnivådomener) filtrert mot en offisielt registrert språktabell før den blir punykodet, og at DNS-protokollen fikser grensene for akseptable lengder på utdata-Punycode-strengen.

Referanse

  1. Punycode: En oppstartsstreng-koding av Unicode for internasjonaliserte domenenavn i applikasjoner (IDNA)

Eksterne lenker (på engelsk)