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“.
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.
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:
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.
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.
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.
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 „$“.
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 proceduraPří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 FunkceKódování znaků | |
---|---|
Historická kódování | doplňková komp. semafor (Makarov) morse Bodo MTK-2 komp. 6bitový SCP RADIX-50 EBCDIC KOI-7 ISO 646 |
moderní 8bitová reprezentace | symboly ASCII non-ASCII 8bitové kódové stránky cyrilice KOI-8 Základní kódování MacCyrillic ISO 8859 1 (lat.) 2 3 čtyři 5 (kir.) 6 7 osm 9 deset jedenáct 12 13 čtrnáct 15 (€) 16 Okna 1250 1251 (Kir.) 1252 1253 1254 1255 1256 1257 1258 WGL4 IBM a DOS 437 850 852 855 866 "alternativní" MIC |
Vícebajtové | tradiční DBCS GB2312 HTML unicode UTF-32 UTF-16 UTF-8 seznam postav cyrilice |
uživatelské rozhraní rozložení klávesnice národní prostředí překlad řádků písmo přepis vlastní písma utility iconv záznam |