UTF-16 ( Unicode Transformation Format ) i datalogi er en af måderne til at kode tegn fra Unicode som en sekvens af 16- bit ord .
Denne kodning giver dig mulighed for at skrive Unicode-tegn i intervallerne U+0000..U+D7FF og U+E000..U+10FFFF (samlet antal 1 112 064 ). I dette tilfælde er hvert tegn skrevet i et eller to ord (et surrogatpar). UTF-16-kodningen er beskrevet i appendiks Q til den internationale standard ISO/IEC 10646 og er også dækket af IETF RFC 2781 "UTF-16, en kodning af ISO 10646".
Den første version af Unicode (1991) var en 16-bit fast-bredde-kodning; det samlede antal forskellige tegn var 2 16 ( 65 536 ). I den anden version af Unicode (1996) blev det besluttet at udvide kodeområdet markant; at opretholde kompatibilitet med de systemer, hvor 16-bit Unicode allerede var implementeret og UTF-16 blev oprettet. Området 0xD800-0xDFFF, forbeholdt surrogatpar, tilhørte tidligere området "tegn til privat brug".
Da 2 20 +2 16 −2048 ( 1 112 064 ) tegn kan vises i UTF-16 , blev dette tal valgt som den nye værdi af Unicode-koderummet.
DC00 | … | DFFE | DFF | |
---|---|---|---|---|
D800 | 010000 | … | 0103FE | 0103FF |
D801 | 010400 | … | 0107FE | 0107FF |
… | … | |||
DBFF | 10FC00 | … | 10FFFE |
I UTF-16 er tegn kodet som dobbeltbyte-ord ved hjælp af alle mulige værdiområder (fra 0 til FFFF 16 ). Det er muligt at indkode Unicode-tegn i intervallerne 0000 16 ..D7FF 16 og E000 16 ..FFFF 16 . Området D800 16 ..DFFF 16 , der er udelukket herfra , bruges kun til indkodning af de såkaldte surrogatpar - tegn, der er kodet med to 16-bit ord.
Unicode-tegn op til og med FFFF 16 (eksklusive området for surrogater) skrives som de er med et 16-bit ord.
Tegn i området 10000 16 ..10FFFF 16 (mere end 16 bit) er kodet i henhold til følgende skema:
Et enkelt UTF-16-tegn er repræsenteret af en sekvens på to bytes eller to par bytes. Hvilken af de to bytes der kommer først, høj eller lav, afhænger af endianiteten . Et system, der er kompatibelt med x86-processorer , kaldes little endian , mens dem med m68k og SPARC- processorer kaldes big endian .
Byterækkefølgen bruges til at bestemme byterækkefølgen . I begyndelsen af teksten skrives koden U+FEFF. Ved læsning, hvis U+FFFE blev betragtet i stedet for U+FEFF, så er byterækkefølgen omvendt (lille endian), da U+FFFE-koden i Unicode ikke koder et tegn og er reserveret kun med det formål at bestemme byten bestille. Fordi UTF-8 ikke bruger værdierne 0xFE og 0xFF, kan du bruge byteordremærket som en funktion til at skelne mellem UTF-16 og UTF-8.
Det er også muligt at angive byte-rækkefølgen eksternt - hertil skal kodningen beskrives som UTF-16LE eller UTF-16BE (little-endian / big-endian), og ikke kun UTF-16. I dette tilfælde er byteordremærket (U+FEFF) ikke nødvendigt.
I Win32 API , der er almindeligt i moderne versioner af Microsoft Windows -operativsystemet , er der to måder at repræsentere tekst på: i form af traditionelle 8-bit kodesider og i form af UTF-16.
Når du bruger UTF-16, sætter Windows ingen begrænsninger for tekstfilkodninger for programmer, hvilket giver dem mulighed for at bruge både UTF-16LE og UTF-16BE ved at indstille og fortolke det passende byte-rækkefølgemærke . Det interne Windows-format er dog altid UTF-16LE. Dette punkt bør tages i betragtning, når du arbejder med eksekverbare filer , der bruger Unicode-versioner af WinAPI-funktioner. Strengene i dem er altid kodet i UTF-16LE [1] .
I NTFS -filsystemer , samt FAT med understøttelse af lange navne, skrives filnavne også i UTF-16LE.
Eksemplerne nedenfor er skrevet i pseudokode og tager ikke højde for byterækkefølgen - de viser kun essensen af kodning. Byte rækkefølge - fra yngre til ældre (Little-Endian, Intel x86). Typen Word er et to-byte-ord (16-bit usigneret heltal), og typen UInt32 er et 32-bit usigneret heltal. Hexadecimale værdier begynder med et dollartegn "$".
I eksemplet WriteWord() en betinget procedure, der skriver ét ord (mens den interne markør flyttes). Funktionen LoWord()returnerer det mindst signifikante ord af et 32-bit heltal (højere bit kasseres uden at se).
// Gyldige kodeværdier: $0000..$D7FF, $E000..$10FFFF. Procedure WriteUTF16Char ( Kode : UInt32 ) If ( Kode < $10000 ) Så WriteWord ( LoWord ( Kode )) Else Kode = Kode - $10000 Var Lo10 : Word = LoWord ( Kode Og $3FF ) Var Hi10 : Word = LoWord ( Kode Shr 10 ) WriteWord ( $D800 Eller Hi10 ) WriteWord ( $DC00 Eller Lo10 ) End If End ProcedureEksemplet ReadWord()læser et ord fra strømmen (skifter den interne markør). Den kan også justere byterækkefølgen, hvis det er nødvendigt. Funktionen WordToUInt32udvider et to-byte-ord til et fire-byte heltal uden fortegn og udfylder de høje bits med nuller. Error()bryder eksekveringen (i det væsentlige en undtagelse ).
// Hvis det lykkes, returneres værdier // i intervallerne $0000..$D7FF og $E000..$10FFFF. Funktion ReadUTF16Char : UInt32 Var Ledende : Ord // Førende (første) ord. Var Efterfølgende : Ord // Følg (andet) ord. Leading = ReadWord () ; If ( Leading < $D800 ) Eller ( Leading > $DFFF ) Returner derefter WordToUInt32 ( Leading ) Else If ( Leading >= $DC00 ) Then Error ( " Ugyldig kodesekvens . " ) Else Var Code : UInt32 Code = WordToUInt32 ( Leading And $3FF ) Shl 10 Trailing = ReadWord () Hvis (( Trailing < $DC00 ) Eller ( Trailing > $DFFF )) Then Error ( "Ugyldig kodesekvens . " ) Else Code = Code Eller WordToUInt32 ( Trailing And $ 3FF ) Return ( Kode + $10000 ) End If End If End - funktionTegnkodninger | |
---|---|
Historiske indkodninger | yderligere komp. semafor (Makarov) morse Bodo MTK-2 komp. 6-bit SCP RADIX-50 EBCDIC KOI-7 ISO 646 |
moderne 8-bit repræsentation | symboler ASCII ikke-ASCII 8-bit kodesider Kyrillisk KOI-8 Grundlæggende kodning Mackyrillisk ISO 8859 1 (lat.) 2 3 fire 5 (kir.) 6 7 otte 9 ti elleve 12 13 fjorten 15 (€) 16 Windows 1250 1251 (Kir.) 1252 1253 1254 1255 1256 1257 1258 WGL4 IBM og DOS 437 850 852 855 866 "alternativ" MIC |
Multibyte | traditionel DBCS GB2312 HTML unicode UTF-32 UTF-16 UTF-8 tegnliste Kyrillisk |
brugergrænseflade tastatur layout lokalitet linje oversættelse skrifttype translitteration brugerdefinerede skrifttyper forsyningsselskaber ikonv optage |