UTF-16

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 11. helmikuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 27 muokkausta .

Tietojenkäsittelytieteen UTF-16 ( Unicode Transformation Format )  on yksi tavoista koodata merkkejä Unicodesta 16- bittisten sanojen sekvenssinä . 

Tällä koodauksella voit kirjoittaa Unicode-merkkejä alueilla U+0000..U+D7FF ja U+E000..U+10FFFF (yhteensä 1 112 064 ). Tässä tapauksessa jokainen merkki kirjoitetaan yhdellä tai kahdella sanalla (korvikepari). UTF-16-koodaus on kuvattu kansainvälisen standardin ISO/IEC 10646 liitteessä Q, ja se katetaan myös IETF RFC 2781 :ssä "UTF-16, ISO 10646:n koodaus".

Ulkoasuhistoria

Unicoden ensimmäinen versio (1991) oli 16-bittinen kiinteän leveyden koodaus; eri merkkien kokonaismäärä oli 2 16 ( 65 536 ). Unicoden toisessa versiossa (1996) päätettiin laajentaa koodialuetta merkittävästi; ylläpitää yhteensopivuutta niiden järjestelmien kanssa, joissa 16-bittinen Unicode oli jo otettu käyttöön ja UTF-16 luotu. Korvauspareille varattu alue 0xD800-0xDFFF kuului aiemmin "yksityiskäyttöön tarkoitettujen hahmojen" -alueeseen.

Koska UTF-16:ssa voidaan näyttää 2 20 +2 16 −2048 ( 1 112 064 ) merkkiä , tämä numero valittiin Unicode-kooditilan uudeksi arvoksi.

Koodauksen periaate

DC00 DFFE DFF
D800 010000 0103FE 0103FF
D801 010400 0107FE 0107FF
DBFF 10FC00 10FFFE  

UTF-16:ssa merkit koodataan kaksitavuisiksi sanoiksi käyttäen kaikkia mahdollisia arvoalueita (0 - FFFF 16 ). On mahdollista koodata Unicode-merkkejä 0000 16 ..D7FF 16 ja E000 16 ..FFFF 16 . Tästä pois jätettyä aluetta D800 16 ..DFFF 16 käytetään vain ns. korvikeparien koodaamiseen - merkit, jotka on koodattu kahdella 16-bittisellä sanalla.

Unicode-merkit aina FFFF 16 :een asti (pois lukien korvikkeiden alue) kirjoitetaan sellaisenaan 16-bittisen sanan kanssa.

Merkit alueella 10000 ..10FFFF 16 (yli 16 bittiä) koodataan seuraavan kaavan mukaan :

Endianness

Yksittäinen UTF-16-merkki esitetään kahden tavun tai kahden tavuparin sarjana. Kumpi kahdesta tavusta on ensin, korkea vai alhainen, riippuu endiaalisuudesta . x86-suorittimien kanssa yhteensopivaa järjestelmää kutsutaan little endianiksi , kun taas m68k- ja SPARC- prosessoreilla varustettuja  järjestelmiä kutsutaan big endianiksi .

Tavujärjestysmerkkiä käytetään tavujärjestyksen määrittämiseen .  _ Tekstin alkuun kirjoitetaan koodi U+FEFF. Jos luettaessa otettiin huomioon U+FFFE U+FEFF:n sijaan, tavujärjestys käännetään (pieni endian), koska Unicoden U+FFFE-koodi ei koodaa merkkiä ja se on varattu vain tavun määrittämiseen. Tilaus. Koska UTF-8 ei käytä arvoja 0xFE ja 0xFF, voit käyttää tavujärjestysmerkkiä ominaisuutena UTF-16:n ja UTF-8:n erottamiseen.

UTF-16LE ja UTF-16BE

On myös mahdollista määrittää tavujärjestys ulkoisesti - tätä varten koodaus on kuvattava nimellä UTF- 16LE tai UTF-16BE (little-endian / big-endian), eikä vain UTF-16. Tässä tapauksessa tavujärjestysmerkkiä (U+FEFF) ei tarvita.

UTF-16 Windowsissa

Microsoft Windows -käyttöjärjestelmän moderneissa versioissa yleisessä Win32 API : ssa on kaksi tapaa esittää tekstiä: perinteisten 8-bittisten koodisivujen muodossa ja UTF-16:n muodossa.

Käytettäessä UTF-16:ta Windows ei aseta rajoituksia sovellusten tekstitiedostojen koodauksille, joten ne voivat käyttää sekä UTF-16LE:tä että UTF-16BE:tä asettamalla ja tulkitsemalla sopivan tavujärjestysmerkin . Windowsin sisäinen muoto on kuitenkin aina UTF-16LE. Tämä seikka tulee ottaa huomioon, kun työskentelet suoritettavien tiedostojen kanssa , jotka käyttävät WinAPI-toimintojen Unicode-versioita. Niiden merkkijonot on aina koodattu UTF-16LE:llä [1] .

NTFS - tiedostojärjestelmissä sekä pitkiä nimiä tukevassa FAT - tiedostojärjestelmässä tiedostojen nimet kirjoitetaan myös UTF-16LE-muodossa.

Esimerkkejä menettelystä

Alla olevat esimerkit on kirjoitettu pseudokoodilla eivätkä ota huomioon tavujärjestyksen maskia - ne osoittavat vain koodauksen olemuksen. Tavujärjestys - nuoremmasta vanhempaan (Little-Endian, Intel x86). Tyyppi Word on kaksitavuinen sana (16-bittinen etumerkitön kokonaisluku) ja tyyppi UInt32 on 32-bittinen etumerkitön kokonaisluku. Heksadesimaaliarvot alkavat dollarimerkillä "$".

Koodaus

Esimerkissä WriteWord() ehdollinen toimintosarja, joka kirjoittaa yhden sanan (siirrettäessä sisäistä osoitinta). Funktio LoWord()palauttaa 32-bittisen kokonaisluvun vähiten merkitsevän sanan (suuremmat bitit hylätään katsomatta).

// Kelvolliset koodin arvot: $0000..$D7FF, $E000..$10FFFF. Toimenpide WriteUTF16Char ( Koodi : UInt32 ) If ( Koodi < $ 10000 ) Sitten KirjoitaWord ( LowWord ( Code ) ) Else Code = Code - $ 10000 Muutt Lo10 : Sana = LowWord ( Koodi ja $ 3FF ) Muut Hi10 : Sana = LoWord ( Koodi ) WriteWord ( $D800 tai Hi10 ) WriteWord ( $DC00 tai Lo10 ) End If End -menettely

Dekoodaus

Esimerkki ReadWord()lukee sanan virrasta (siirtää sisäistä osoitinta). Se voi myös tarvittaessa säätää tavujärjestystä. Funktio WordToUInt32laajentaa kaksitavuisen sanan nelitavuiseksi etumerkittömäksi kokonaisluvuksi ja täyttää korkeat bitit nolilla. Error()katkaisee suorituksen (olennaisesti poikkeus ).

// Jos onnistuu, arvot // välillä $0000..$D7FF ja $E000..$10FFFF palautetaan. Funktio ReadUTF16Char : UInt32 Muuttaja Alkusana : Sana // Johtava (ensimmäinen) sana . Muutt Trailing : Word // Seuraa (toista) sanaa. Johtava = ReadWord () ; If ( Leading < $D800 ) Tai ( Leading > $DFFF ) Then Return WordToUInt32 ( Leading ) Else If ( Leading > = $DC00 ) Then Error ( " Virheellinen koodisarja . " ) Else Muuttujakoodi : UInt32 Code = WordToUInt32 ( Johtava ja $3FF ) Shl 10 Trailing = ReadWord () If (( Trailing < $DC00 ) Tai ( Trailing > $DFFF )) then Error ( "Virheellinen koodisekvenssi . " ) Else Code = Koodi tai WordToUInt32 ( Loppu ja $ 3FF ) Paluu ( Koodi + $10000 ) End If End If End -toiminto

Muistiinpanot

  1. ↑ Tavujärjestysmerkkien käyttäminen . Käyttöpäivä: 18. helmikuuta 2016. Arkistoitu alkuperäisestä 22. tammikuuta 2016.

Linkit