Punycode - Punycode

Punycode er en repræsentation af Unicode med den begrænsede ASCII karakter delmængde bruges til Internet værtsnavne . Ved hjælp af Punycode transcodes værtsnavne, der indeholder Unicode-tegn, til en delmængde af ASCII bestående af bogstaver, cifre og bindestreger, der kaldes Letter-Digit-Hyphen (LDH) -undersæt. For eksempel er München ( tysk navn for München ) kodet som Mnchen-3ya .

Mens Domain Name System (DNS) teknisk understøtter vilkårlige sekvenser af oktetter i domænenavnemærker, anbefaler DNS-standarderne, at LDH-undersæt af ASCII, der traditionelt bruges til værtsnavne, og kræver, at strengesammenligninger mellem DNS-domænenavne skal være store ufølsom. Punycode-syntaksen er en metode til kodning af strenge, der indeholder Unicode-tegn, såsom internationaliserede domænenavne (IDNA), i LDH-undergruppen af ​​ASCII, der foretrækkes af DNS. Det er specificeret i IETF- anmodning om kommentarer 3492.

Kodningsprocedure

Som anført i RFC 3492 er "Punycode en forekomst af en mere generel algoritme kaldet Bootstring , som tillader strenge sammensat af et lille sæt" grundlæggende "kodepunkter til entydigt at repræsentere enhver streng af kodepunkter trukket fra et større sæt." Punycode definerer parametre for den generelle Bootstring-algoritme, der svarer til Unicode-tekstens egenskaber. Dette afsnit demonstrerer proceduren for Punycode-kodning ved hjælp af eksemplet med strengen "bücher" ( Bücher er tysk for bøger ), som oversættes til etiketten "bcher-kva".

Adskillelse af ASCII-tegn

For det første kopieres alle ASCII- tegn i strengen fra input til output og springer over andre tegn. For eksempel kopieres "bücher" til "bcher". Hvis der blev kopieret nogen tegn, dvs. der var mindst et ASCII-tegn i inputet, tilføjes en ASCII-bindestreg til udgangen næste (f.eks. "Bücher" → "bcher-", men "ü" → ""). Da ASCII-bindestreg er et ASCII-tegn, kan bindestregen selv vises i output før denne ekstra bindestreg. Den ekstra bindestreg forårsager imidlertid ikke nogen tvetydighed, når output læses, da ingen senere del af kodningsprocessen kan introducere en anden ASCII-bindestreg; hvis der er en eller flere ASCII-bindestreger i output, betyder den sidste altid slutningen af ​​ASCII-tegnene.

Kodning af ikke-ASCII-tegnindsættelser som kodenumre

Den næste del af kodningsprocessen kræver først en forståelse af dekoderen, som er en endelig tilstandsmaskine med to tilstandsvariabler i og n . i er et indeks i strengen, der spænder fra nul (repræsenterer en potentiel indsættelse i starten) til den aktuelle længde af den udvidede streng (repræsenterer en potentiel indsættelse i slutningen).

jeg starter ved nul, og n starter ved 128 (det første ikke-ASCII-kodepunkt). Tilstandsprogression er en monoton funktion . En tilstandsændring enten i trin i eller, hvis jeg er på sit maksimale, nulstiller jeg til nul og trin n med 1, og går derefter tilbage til stigning i i den følgende tilstandsændring. Ved hver tilstandsændring indsættes enten det kodepunkt, der er angivet med n, eller det indsættes ikke.

Kodenumrene genereret af koderen repræsenterer hvor mange muligheder for at springe over, før en indsættelse foretages. Der er seks mulige steder at indsætte et tegn i den aktuelle streng "bcher" (inklusive før det første tegn og efter det sidste). Der er 124 kodepunkter mellem den sidst betragtede (127 = 0x7F, slutningen af ​​ASCII) og "ü" (kodepunkt 252 = 0xFC, se Unicodes Latin-1 Supplement ). Der er også en position til at indsætte en "ü", der skal springes over (i position nul før 'b'). Derfor er det nødvendigt at fortælle dekoderen at springe i alt over (6 × 124) + 1 = 745 mulige indsættelser, før man kommer til den krævede. Når tegnet er indsat, er der nu syv mulige steder at indsætte et andet tegn.

Genkodning af kodenumre som ASCII-sekvenser

Punycode bruger generelle heltal med variabel længde til at repræsentere disse værdier. For eksempel er dette, hvordan "kva" bruges til at repræsentere kodenummer 745:

Der anvendes et talesystem med lille endian-ordning, der tillader koder med variabel længde uden separate afgrænsere: et ciffer, der er lavere end en tærskelværdi, markerer, at det er det mest signifikante ciffer, deraf slutningen af ​​nummeret. Tærskelværdien afhænger af positionen i nummeret og også af tidligere indsættelser for at øge effektiviteten. Tilsvarende varierer cifrets vægt.

I dette tilfælde anvendes et talesystem med 36 symboler, hvor det store og små bogstav 'a' til 'z' er lig med decimaltallene 0 til 25 og '0' til '9' er lig med decimaltallene 26 til 35. Således svarer "kva" til decimaltalstrengen "10 21 0".

For at afkode denne streng af symboler er det nødvendigt med en sekvens af tærskler, i dette tilfælde (1, 1, 26). Vi kan vise, at vægten af ​​det mindst signifikante ciffer altid er 1, dvs. det første symbol er enhedens stedværdi ; 'k' (= 10) med en vægt på 1 er lig med 10. Herefter afhænger vægten af ​​det næste ciffer af den første tærskel. Det andet symbol har en placeringsværdi på 36 minus den forrige tærskelværdi, i dette tilfælde 35. Derfor er summen af ​​de to første symboler 'k' (= 10) og 'v' (= 21) 10 × 1 + 21 × 35. Da det andet symbol ikke er mindre end tærskelværdien 1, er der mere der kommer. Da det tredje symbol i dette eksempel er 'a' (= 0), kan vi dog ignorere beregningen af ​​dets vægt. Derfor repræsenterer "kva" decimaltallet (10 × 1) + (21 × 35) = 745.

Det er let at vise ved induktion, at vægten af ​​det ( n +1) -te ciffer er vægten af ​​de foregående gange (36 - tærsklen for det n- cifrede).

Selve tærsklerne bestemmes for hver efter hinanden kodede karakter af en algoritme, der holder dem mellem 1 og 26 inklusive, hvilket betyder, at det sidste tegn i en kodning altid vil være alfabetisk. Sagen kan derefter bruges til at give information om strengens originale sag.

Ved indsættelse af et andet specialtegn i "bücher" er den første mulighed "büücher" med kode "bcher-kvaa", den anden "bücüher" med kode "bcher-kvab" osv. Efter "bücherü" med kode " bcher-kvae "kommer koder, der repræsenterer indsættelse af ý, tegnet følger ü, startende med" ýbücher "med kode" bcher-kvaf "(forskellig fra" übücher "kodet" bcher-jvab ") osv.

For at gøre kodnings- og dekodningsalgoritmerne enkle, er der ikke gjort noget forsøg på at forhindre, at nogle kodede værdier koder for ikke-tilladte Unicode-værdier: Disse skal dog kontrolleres for og detekteres under dekodning.

Punycode er designet til at arbejde på tværs af alle scripts og til at være selvoptimerende ved at forsøge at tilpasse sig tegnsætområderne i strengen, når den fungerer. Det er optimeret til det tilfælde, hvor strengen er sammensat af nul eller flere ASCII-tegn og derudover kun tegn fra et andet script-system, men vil klare enhver vilkårlig Unicode-streng. Bemærk, at til DNS-brug antages domænenavnstrengen at være blevet normaliseret ved hjælp af Nameprep og (for topdomæner ) filtreret mod en officielt registreret sprogtabel, før den blev kodet, og at DNS-protokollen angiver grænser for de acceptable længder af output Punycode-streng.

Eksempler

Den følgende tabel viser eksempler på Punycode-kodninger til forskellige typer input.

Indgang Punktkode for input Beskrivelse af input
Den tomme streng.
-en en- Kun ASCII-tegn, et, små bogstaver.
EN EN- Kun ASCII-tegn, et stort bogstav.
3 3- Kun ASCII-tegn, et, et ciffer.
- - Kun ASCII-tegn, en, en bindestreg.
- --- Kun ASCII-tegn, to bindestreger.
London London- Kun ASCII-tegn, mere end en, ingen bindestreger.
Lloyd-Atkinson Lloyd-Atkinson- Kun ASCII-tegn, en bindestreg.
Dette har mellemrum Dette har mellemrum- Kun ASCII-tegn med mellemrum.
-> $ 1,00 <- -> $ 1,00 <- Kun ASCII-tegn, blandede symboler.
ü tda Ingen ASCII-tegn, et Latin-1 Supplement-tegn.
a mxa Ingen ASCII-tegn, en græsk karakter.
fsq Ingen ASCII-tegn, et CJK-tegn.
😉 n28h Ingen ASCII-tegn, et emoji-tegn.
αβγ mxacd Ingen ASCII-tegn, mere end et tegn.
München Mnchen-3ya Blandet streng med et tegn, der ikke er et ASCII-tegn.
Mnchen-3ya Mnchen-3ya- Dobbeltkodet Punycode af "München".
München-Ost Mnchen-Ost-9db Blandet streng med et tegn, der ikke er ASCII, og en bindestreg.
Bahnhof München-Ost Bahnhof Mnchen-Ost-u6b Blandet streng med et mellemrum, en bindestreg og et tegn, der ikke er ASCII.
abæcdöef abcdef-qua4k Blandet streng, to ikke-ASCII-tegn.
правда 80aafi6cg Russisk uden ASCII.
ย จ ฆ ฟ ค ฏ ข 22cdfh1b8fsa Thai uden ASCII.
도메인 hq1bm8jm9l Koreansk uden ASCII.
ド メ イ ン 名 例 eckwd4c7cu47r2wf Japansk uden ASCII.
Maji で Koi す る 5 秒 前 MajiKoi5-783gue6qz075azm5e Japansk med ASCII.
「Bücher」 bcher-kva8445foa Blandede ikke-ASCII-scripts (Latin-1 Supplement og CJK).

Internationaliserede domænenavne

For at forhindre ikke-internationale domænenavne, der indeholder bindestreger, ved et uheld at blive fortolket som Punycode, har det internationale domænenavn Punycode-sekvenser et såkaldt ASCII Compatible Encoding (ACE) præfiks, "xn -", præpenderet. Således vil domænenavnet "bücher.tld" blive repræsenteret i ASCII som "xn - bcher-kva.tld".

Se også

Referencer

eksterne links