UTF-16

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. február 11-én felülvizsgált verziótól ; az ellenőrzések 27 szerkesztést igényelnek .

Az UTF-16 ( Unicode Transformation Format ) a számítástechnikában  az egyik módja annak, hogy a karaktereket Unicode -ból 16 bites szavak sorozataként kódolják . 

Ez a kódolás lehetővé teszi az U+0000..U+D7FF és U+E000..U+10FFFF tartományba eső Unicode karakterek írását (összesen 1 112 064 ). Ebben az esetben minden karakter egy vagy két szóban van írva (helyettesítő pár). Az UTF-16 kódolást az ISO/IEC 10646 nemzetközi szabvány Q függeléke írja le, és az IETF RFC 2781 „UTF-16, az ISO 10646 kódolása” is lefedi.

Megjelenéstörténet

Az Unicode első verziója (1991) 16 bites fix szélességű kódolás volt; a különböző karakterek száma összesen 2 16 ( 65 536 ) volt. A Unicode második verziójában (1996) a kódterület jelentős bővítése mellett döntöttek; a kompatibilitás fenntartása azokkal a rendszerekkel, ahol a 16 bites Unicode már implementálva volt, és az UTF-16 létrejött. A pótpárok számára fenntartott 0xD800-0xDFFF terület korábban a "magánhasználatú karakterek" területhez tartozott.

Mivel UTF-16-ban 2 20 +2 16 −2048 ( 1 112 064 ) karakter jeleníthető meg , ezt a számot választottuk a Unicode kódtér új értékének.

A kódolás elve

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

Az UTF-16-ban a karakterek kétbájtos szavakként vannak kódolva az összes lehetséges értéktartomány használatával (0-tól FFFF 16 -ig ). Lehetőség van Unicode karakterek kódolására a 0000 16 ..D7FF 16 és E000 16 ..FFFF 16 tartományban . Az innen kizárt D800 16 ..DFFF 16 tartomány csak az úgynevezett helyettesítő párok kódolására szolgál, amelyek két 16 bites szóval vannak kódolva.

Az FFFF 16 -ig bezárólag Unicode-karakterek (kivéve a helyettesítők tartományát) úgy íródnak, ahogy a 16 bites szónál vannak.

Az 10000 16 ..10FFFF 16 tartományba eső karakterek (több mint 16 bit) a következő séma szerint vannak kódolva:

Endianness

Egyetlen UTF-16 karaktert két bájtból vagy két bájtpárból álló sorozat képvisel. A két bájt közül melyik jön előbb, magas vagy alacsony, az a végződéstől függ . Az x86-os processzorokkal kompatibilis rendszereket little endiannak , míg az m68k és SPARC processzorokkal kompatibilis  rendszereket big endiannak nevezik .

A bájtsorrend jelölése a bájtsorrend meghatározására szolgál .  A szöveg elejére az U+FEFF kódot írjuk. Ha az olvasás során az U+FFFE-t vettük figyelembe az U+FEFF helyett, akkor a bájtsorrend megfordul (kis endian), mivel az U+FFFE kód a Unicode-ban nem kódol karaktert, és csak a bájt meghatározására van fenntartva. rendelés. Mivel az UTF-8 nem használja a 0xFE és 0xFF értékeket, használhatja a bájtsorrend-jelet az UTF-16 és az UTF-8 megkülönböztetésére.

UTF-16LE és UTF-16BE

Lehetőség van a bájtsorrend külső megadására is - ehhez a kódolást UTF-16LE vagy UTF-16BE (little-endian / big-endian), nem csak UTF-16-ként kell leírni. Ebben az esetben a bájtsorrend-jel (U+FEFF) nem szükséges.

UTF-16 Windows rendszeren

A Microsoft Windows operációs rendszer modern verzióiban elterjedt Win32 API -ban kétféle módon lehet szöveget megjeleníteni: hagyományos 8 bites kódlapok és UTF-16 formájában.

Az UTF-16 használatakor a Windows nem korlátozza az alkalmazások szövegfájl-kódolását, lehetővé téve számukra az UTF-16LE és az UTF-16BE használatát a megfelelő bájtsorrend-jel beállításával és értelmezésével . A Windows belső formátuma azonban mindig UTF-16LE. Ezt a pontot figyelembe kell venni, ha olyan futtatható fájlokkal dolgozik, amelyek a WinAPI függvények Unicode verzióit használják. A bennük lévő karakterláncok mindig UTF-16LE kódolásúak [1] .

Az NTFS fájlrendszerekben , valamint a hosszú neveket támogató FAT -ban a fájlnevek UTF-16LE-ben is íródnak.

Eljárási példák

Az alábbi példák pszeudokóddal vannak írva, és nem veszik figyelembe a bájtsorrend-maszkot - csak a kódolás lényegét mutatják be. Byte sorrend - fiatalabbtól az idősebbig (Little-Endian, Intel x86). A típus Word egy kétbájtos szó (16 bites előjel nélküli egész), a típus UInt32 pedig egy 32 bites előjel nélküli egész. A hexadecimális értékek "$" dollárjellel kezdődnek.

Kódolás

A példában WriteWord() egy feltételes eljárás, amely egy szót ír (a belső mutató eltolása közben). A függvény LoWord()egy 32 bites egész szám legkisebb jelentőségű szavát adja vissza (a magasabb biteket a rendszer figyelmen kívül hagyja).

// Érvényes kódértékek: $0000..$D7FF, $E000..$10FFFF. Eljárás WriteUTF16Char ( Kód : UInt32 ) If ( Kód < 10000 $ ) Akkor WriteWord ( LowWord ( Code ) ) Else Code = Code - $ 10000 Var Lo10 : Word = LoWord ( Code and $ 3FF ) Var Hi10 : Word = Shr10 ( Code ) WriteWord ( $D800 vagy Hi10 ) WriteWord ( $DC00 vagy Lo10 ) End If End eljárás

Dekódolás

A példa ReadWord()egy szót olvas be az adatfolyamból (eltolja a belső mutatót). Szükség esetén módosíthatja a bájtok sorrendjét is. A függvény WordToUInt32egy kétbájtos szót négybájtos előjel nélküli egész számra bont ki, a magas biteket nullákkal töltve ki. Error()megszakítja a végrehajtást (lényegében kivétel ).

// Ha sikeres, a // értékek a $0000..$D7FF és $E000..$10FFFF tartományba esnek vissza. Funkció ReadUTF16Char : UInt32 Var Leading : Word // Vezető (első) szó. Var Trailing : Word // Kövesse a (második) szót. Leading = ReadWord () ; If ( Leading < $D800 ) Or ( Leading > $DFFF ) Then Return WordToUInt32 ( Leading ) Else If ( Leading >= $DC00 ) Then Error ( " Érvénytelen kódsorozat . " ) Else Var Code : UInt32 Code = WordToUInt32 ( Leading And $3FF ) Shl 10 Trailing = ReadWord () If (( Trailing < $DC00 ) Vagy ( Trailing > $DFFF )) then Error ( "Érvénytelen kódsorozat . " ) Else Code = Code Or WordToUInt32 ( Utolsó és $ 3FF ) Vissza ( Kód + 10000 USD ) End If End If End funkció

Jegyzetek

  1. Byte Order Marks használata . Hozzáférés időpontja: 2016. február 18. Az eredetiből archiválva : 2016. január 22.

Linkek