Muuttuvan leveyden koodaus - Variable-width encoding
Muuttuja-leveys koodaus on eräänlainen merkki koodaus järjestelmän, joka koodaa eripituisia käytetään koodaamaan merkistön (valikoimaa symbolit) edustus, tavallisesti tietokoneeseen . Yleisimmät vaihtelevan leveyden koodaukset ovat monitavuisia koodauksia , jotka käyttävät vaihtelevaa määrää tavuja ( oktetteja ) eri merkkien koodaamiseen. (Jotkut kirjoittajat, erityisesti Microsoftin dokumentaatiossa, käyttävät termiä monitavuinen merkkijoukko, joka on harhaanjohtava , koska esityksen koko on koodauksen, ei merkkijoukon ominaisuus.)
Varhaisia vaihtelevan leveyden koodauksia, joissa käytettiin alle tavua merkkiä kohden, käytettiin joskus englanninkielisen tekstin pakkaamiseen vähemmän tavuihin seikkailupeleissä varhaisille mikrotietokoneille . Kuitenkin levyt (jotka toisin kuin nauhat mahdollistivat sattumanvaraisen pääsyn tekstin lataamiseen tarvittaessa), tietokoneen muistin lisääntyminen ja yleiskäyttöiset pakkausalgoritmit ovat tehneet tällaiset temput pitkälti vanhentuneiksi.
Monitavuiset koodaukset ovat yleensä seurausta tarpeesta lisätä koodattavien merkkien määrää rikkomatta taaksepäin yhteensopivuutta olemassa olevan rajoituksen kanssa. Esimerkiksi yhdellä tavulla (8 bittiä) merkkiä kohti voidaan koodata 256 mahdollista merkkiä; jotta voidaan koodata yli 256 merkkiä, ilmeinen valinta olisi käyttää kahta tai useampaa tavua koodausyksikköä kohti, kaksi tavua (16 bittiä) sallii 65536 mahdollista merkkiä, mutta tällainen muutos rikkoisi yhteensopivuuden olemassa olevien järjestelmien kanssa, joten se ei ehkä olla toteutettavissa ollenkaan.
Yleinen rakenne
Koska monitavuisen koodausjärjestelmän tavoitteena on minimoida muutokset olemassa olevaan sovellusohjelmistoon, joidenkin merkkien on säilytettävä olemassa olevat yhden yksikön koodit, vaikka toisten merkkien koodeissa on useita yksiköitä. Tuloksena on, että vaihtelevan leveyden koodauksessa on kolmenlaisia yksiköitä: yksittäiset yksiköt , jotka koostuvat yhdestä yksiköstä, johtavat yksiköt , jotka tulevat ensin moniyksikköjärjestyksessä , ja jälkiyksiköt , jotka tulevat myöhemmin moniyksikköjärjestyksessä. Syöttö- ja näyttöohjelmiston on tietysti tiedettävä monitavuisen koodausjärjestelmän rakenne, mutta muiden ohjelmistojen ei yleensä tarvitse tietää, edustavatko tavuparit kahta erillistä merkkiä vai vain yhtä merkkiä.
Esimerkiksi nelimerkkinen merkkijono " I ♥ NY " on koodattu UTF-8: een näin (näytetään heksadesimaalitavuina ): 49 E2 99 A5 4E 59 . Tämän sarjan kuudesta yksiköstä 49 , 4E ja 59 ovat yksittäisiä ( I, N ja Y ), E2 on johtava yksikkö ja 99 ja A5 ovat polkuyksiköitä. Sydänsymbolia edustaa johdinyksikön ja kahden polkuyksikön yhdistelmä.
UTF-8 helpottaa ohjelman tunnistamaan kolmenlaisia yksiköitä, koska ne kuuluvat erillisiin arvoalueisiin. Vanhemmat vaihtelevan leveyden koodaukset eivät yleensä ole yhtä hyvin suunniteltuja, koska alueet voivat olla päällekkäisiä. Muuttuvan leveyden koodausta käsittelevän tekstinkäsittelyohjelman on skannattava teksti kaikkien lopullisten sekvenssien alusta eri yksiköiden tunnistamiseksi ja tekstin tulkitsemiseksi oikein. Tällaisissa koodauksissa on mahdollista kohdata vääriä positiivisia tuloksia etsiessään merkkijonoa tekstin keskeltä. Jos esimerkiksi heksadesimaaliset arvot DE, DF, E0 ja E1 voivat olla joko johtavia yksiköitä tai jälkiyksiköitä, kahden yksikön sekvenssin DF E0 haku voi antaa väärän positiivisen sekvenssin DE DF E0 E1, joka koostuu kahdesta peräkkäisestä kahden yksikön sekvenssistä. On myös olemassa vaara, että yksi vioittunut tai kadonnut yksikkö voi tehdä suuren tuloksen moniosaisia sekvenssejä vääriksi. Vaihtelevan leveyden koodauksessa, jossa kaikki kolme yksikkötyyppiä eroavat toisistaan, merkkijonohaku toimii aina ilman vääriä positiivisia tuloksia, ja (jos dekooderi on kirjoitettu hyvin) yhden yksikön vioittuminen tai menetys turmelee vain yhden merkin.
CJK -monitavuiset koodaukset
Ensimmäinen monitavuista koodausta käytettiin kiinalaisen, japanilaisen ja korealaisen koodaukseen, joissa on suuria merkistöjä, jotka ylittävät selvästi 256 merkkiä. Aluksi koodaus rajoitettiin 7 bitin rajaan. ISO-2022-JP, ISO-2022-CN ja ISO-2022-KR koodaukset käytetään alueella 21-7E (heksadesimaali) sekä lyijyä yksiköt ja polku yksiköitä, ja merkitty ne pois singletons käyttäen ISO 2022 paeta sekvenssit vaihtaa yhden tavun ja monitavuisen tilan välillä. Aluksi voitiin koodata yhteensä 8 836 (94 × 94) merkkiä ja muita 94 × 94 merkin sarjoja vaihdettaessa. CJK: n ISO 2022 -koodausmenetelmät ovat edelleen käytössä Internetissä. Näiden koodausten tilallinen luonne ja suuri päällekkäisyys tekevät niistä erittäin hankala käsitellä.
Käytössä Unix alustoille, ISO 2022 7-bittisiä merkkikoodauksia korvattiin joukko 8-bittinen koodauskäytännöistä laajennettu Unix Koodi: EUC-JP, EUC-CN ja EUC-KR. Sen sijaan, että erotettaisiin monen yksikön sekvenssit ja singletonit, joissa oli paeta sekvenssejä, mikä teki koodauksista tilallisia, moniyksikköjaksot merkittiin merkitsemällä merkittävin bittisarja, eli olemalla alueella 80 - FF (heksadesimaali), kun taas yksittäiset olivat pelkästään alueella 00-7F. Pääyksiköt ja reittiyksiköt olivat alueella A1 - FE (heksadesimaali), eli sama kuin niiden alue ISO 2022 -koodauksissa, mutta korkean bitin asetuksena oli 1. Nämä koodaukset olivat kohtuullisen helppoja työskennellä, jos kaikki Erottimet olivat ASCII -merkkejä ja välttit merkkijonojen katkaisemista kiinteään pituuteen, mutta tauko monitavuisen merkin keskellä voi silti aiheuttaa suurta korruptiota.
PC: llä ( DOS- ja Microsoft Windows -alustat) vahvistettiin kaksi koodausta japanilaiselle ja perinteiselle kiinalaiselle, joissa kaikki yksittäiset, johtavat yksiköt ja polkuyksiköt olivat päällekkäisiä: Shift-JIS ja Big5 . Shift-JIS: ssä lyijyyksiköiden vaihteluväli oli 81–9F ja E0 – FC, polkuyksiköiden vaihteluväli oli 40–7E ja 80 – FC ja yksittäisillä 21–7E ja A1 – DF. Big5: ssä lyijyyksiköillä oli alue A1 – FE, polkuyksiköillä vaihteluväli 40–7E ja A1 – FE, ja yksittäisillä oli alue 21–7E (kaikki arvot heksadesimaalilla). Tämä päällekkäisyys teki jälleen käsittelystä hankalaa, vaikka ainakin useimmilla symboleilla oli ainutlaatuisia tavuarvoja (tosin kummallisesti käänteisviiva ei).
Unicode-säädettävät leveyskoodaukset
Unicode- standardi on kaksi muuttuvan leveys koodaukset: UTF-8 ja UTF-16 (se on myös kiinteä-leveys koodaus, UTF-32 ). Alun perin sekä Unicode- että ISO 10646 -standardit oli tarkoitettu kiinteäleveisiksi. Unicode oli 16-bittinen ja ISO 10646 32-bittinen. ISO 10646 tarjosi muuttuvan leveyden koodauksen nimeltä UTF-1 , jossa yksittäisillä oli alue 00–9F, lyijyyksiköillä alue A0 – FF ja jälkiyksiköillä alueet A0 – FF ja 21–7E. Tämän huonon suunnittelun vuoksi, joka muistuttaa Shift JIS: ää ja Big5 : tä arvojen päällekkäisyydessä, Plan 9 -käyttöjärjestelmän keksijät, jotka ottivat ensimmäisenä käyttöön Unicoden kaikkialla, hylkäsivät sen ja korvasivat sen paljon paremmin suunnitellulla Unicode-koodauksella : UTF-8, jossa yksittäislauseilla on alue 00–7F, johtoyksiköillä on alue C0 – FD (nyt oikeastaan C2 – F4, liian pitkien sekvenssien välttämiseksi ja synkronoinnin ylläpitämiseksi UTF-16: n koodauskapasiteetin kanssa; katso UTF -8 artikkeli), ja polkuyksiköiden alue on 80– BF. Pääyksikkö kertoo myös kuinka monta polkuyksikköä seuraa: yksi C2 – DF, kaksi E0 – EF ja kolme F0 – F4 jälkeen.
UTF-16 suunniteltiin vapauttamaan alkuperäisen Unicoden (1.x) 65 536 merkin rajoitus rikkomatta yhteensopivuutta 16-bittisen koodauksen kanssa. UTF-16: ssa yksittäislauseilla on alue 0000-D7FF (55 296 koodipistettä) ja E000-FFFF (8192 koodipistettä, yhteensä 63 488), johtavat yksiköt alue D800-DBFF (1024 koodipistettä) ja jälkiyksiköt alue DC00– DFFF (1024 koodipistettä, yhteensä 2048). Johto- ja polkuyksiköt, joita Unicode -terminologiassa kutsutaan vastaaviksi korvikkeiksi ja matalaksi korvaaviksi , kartoittavat 1024 × 1024 tai 1048576 täydentävää merkkiä, jolloin saadaan 1112664 (63488 BMP -koodipistettä + 1048576 koodipistettä, joita edustavat korkeat ja matalat sijaissarjat) tai skalaariarvot Unicode -kielellä (sijaissyöttöjä ei voida koodata).
Katso myös
- wchar_t leveitä merkkejä
- Lotus-monitavuinen merkistö (LMBCS)
- Kolmen tavun merkkisarja (TBCS)
- Kaksitavuinen merkistö (DBCS)
- Yksitavuinen merkistö (SBCS)