UTF-16

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 11. února 2018; kontroly vyžadují 27 úprav .

UTF-16 ( Unicode Transformation Format ) v informatice  je jedním ze způsobů kódování znaků z Unicode jako sekvence 16bitových slov . 

Toto kódování umožňuje psát znaky Unicode v rozsahu U+0000..U+D7FF a U+E000..U+10FFFF (celkový počet 1 112 064 ). V tomto případě je každý znak napsán jedním nebo dvěma slovy (náhradní dvojice). Kódování UTF-16 je popsáno v příloze Q mezinárodního standardu ISO/IEC 10646 a je také zahrnuto v IETF RFC 2781 „UTF-16, kódování ISO 10646“.

Historie vzhledu

První verze Unicode (1991) byla 16bitové kódování s pevnou šířkou; celkový počet různých znaků byl 2 16 ( 65 536 ). Ve druhé verzi Unicode (1996) bylo rozhodnuto výrazně rozšířit oblast kódu; zachovat kompatibilitu s těmi systémy, kde již bylo implementováno 16bitové Unicode a bylo vytvořeno UTF-16. Oblast 0xD800-0xDFFF, vyhrazená pro náhradní páry, dříve patřila do oblasti „postavy pro soukromé použití“.

Protože v UTF-16 lze zobrazit 2 20 +2 16 −2048 ( 1 112 064 ) znaků , bylo toto číslo zvoleno jako nová hodnota kódového prostoru Unicode.

Princip kódování

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

V UTF-16 jsou znaky kódovány jako dvoubajtová slova pomocí všech možných rozsahů hodnot (od 0 do FFFF 16 ). Je možné kódovat znaky Unicode v rozsahu 0000 16 ..D7FF 16 a E000 16 ..FFFF 16 . Zde vyloučený rozsah D800 16 ..DFFF 16 se používá právě pro kódování tzv. náhradních dvojic - znaků, které jsou zakódovány dvěma 16bitovými slovy.

Znaky Unicode až do FFFF 16 včetně (kromě rozsahu pro náhradní znaky) se zapisují tak, jak jsou, pomocí 16bitového slova.

Znaky v rozsahu 10000 16 ..10FFFF 16 (více než 16 bitů) jsou kódovány podle následujícího schématu:

Endianness

Jeden znak UTF-16 je reprezentován sekvencí dvou bajtů nebo dvou párů bajtů. Který z těchto dvou bajtů je první, vysoký nebo nízký, závisí na endianness . Systém kompatibilní s procesory x86 se nazývá little endian , zatímco systémy s procesory m68k a SPARC  se nazývají big endian .

Značka pořadí bajtů se používá k určení pořadí bajtů .  Na začátku textu je napsán kód U+FEFF. Pokud při čtení bylo uvažováno U+FFFE místo U+FEFF, pak je pořadí bajtů obrácené (little endian), protože kód U+FFFE v Unicode nekóduje znak a je vyhrazen pouze pro účely určení bajtu. objednat. Protože UTF-8 nepoužívá hodnoty 0xFE a 0xFF, můžete použít značku pořadí bajtů jako funkci k rozlišení mezi UTF-16 a UTF-8.

UTF-16LE a UTF-16BE

Pořadí bajtů je také možné zadat externě – k tomu musí být kódování popsáno jako UTF-16LE nebo UTF-16BE (little-endian / big-endian), nikoli pouze UTF-16. V tomto případě není značka pořadí bajtů (U+FEFF) potřeba.

UTF-16 v systému Windows

V Win32 API , běžném v moderních verzích operačního systému Microsoft Windows , existují dva způsoby reprezentace textu: ve formě tradičních 8bitových kódových stránek a ve formě UTF-16.

Při použití UTF-16 neklade Windows žádná omezení na kódování textových souborů pro aplikace, což jim umožňuje používat UTF-16LE i UTF-16BE nastavením a interpretací příslušné značky pořadí bajtů . Interní formát Windows je však vždy UTF-16LE. Tento bod je třeba vzít v úvahu při práci se spustitelnými soubory , které používají Unicode verze funkcí WinAPI. Řetězce v nich jsou vždy kódovány v UTF-16LE [1] .

V souborových systémech NTFS , stejně jako FAT s podporou dlouhých jmen, jsou názvy souborů také psány v UTF-16LE.

Příklady procedur

Níže uvedené příklady jsou napsány v pseudokódu a neberou v úvahu masku pořadí bajtů – ukazují pouze podstatu kódování. Pořadí bajtů - od mladších po starší (Little-Endian, Intel x86). Typ Word je dvoubajtové slovo (16bitové celé číslo bez znaménka) a typ UInt32 je 32bitové celé číslo bez znaménka. Hexadecimální hodnoty začínají znakem dolaru „$“.

Kódování

V příkladu WriteWord() podmíněná procedura, která zapíše jedno slovo (při posunu vnitřního ukazatele). Funkce LoWord()vrací nejméně významné slovo z 32bitového celého čísla (vyšší bity jsou zahozeny bez pohledu).

// Platné hodnoty kódu: $0000..$D7FF, $E000..$10FFFF. Procedura WriteUTF16Char ( Kód : UInt32 ) If ( Kód < $ 10000 ) Then WriteWord ( LowWord ( Code )) Else Code = Kód - $ 10000 Var Lo10 : Word = LoWord ( Kód A $ 3FF ) Var Hi10 : Word = LoWord ( Code Shr 10 ) WriteWord ( $ D800 nebo Hi10 ) WriteWord ( $ DC00 nebo Lo10 ) End If End procedura

Dekódování

Příklad ReadWord()čte slovo z proudu (posune vnitřní ukazatel). V případě potřeby může také upravit pořadí bajtů. Funkce WordToUInt32rozšíří dvoubajtové slovo na čtyřbajtové celé číslo bez znaménka a doplní vysoké bity nulami. Error()přeruší provádění (v podstatě výjimka ).

// V případě úspěchu se vrátí hodnoty // v rozsahu $0000..$D7FF a $E000..$10FFFF. Funkce ReadUTF16Char : UInt32 Var Leading : Word // Úvodní (první) slovo. Var Trailing : Word // Následujte (druhé) slovo. Úvodní = PřečístSlovo () ; If ( Leading < $D800 ) Or ( Leading > $DFFF ) Then Return WordToUInt32 ( Leading ) Else If ( Leading >= $DC00 ) Then Error ( "Neplatná sekvence kódu . " ) Else Kód Var : Kód UInt32 = WordToUInt32 ( Leading And $3FF ) Shl 10 Koncová = ReadWord () If (( Koncová < $ DC00 ) Nebo ( Koncová > $ DFFF )) Then Error ( " Neplatná sekvence kódu . " ) Else Code = Kód Nebo WordToUInt32 ( Koncová a $ 3FF ) Návrat ( Kód + $10000 ) End If End If End Funkce

Poznámky

  1. Používání značek pořadí bajtů . Datum přístupu: 18. února 2016. Archivováno z originálu 22. ledna 2016.

Odkazy