UTF-16

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 11. februar 2018; checks kræver 27 redigeringer .

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".

Udseende historie

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.

Princippet om kodning

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:

Endianness

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.

UTF-16LE og UTF-16BE

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.

UTF-16 på Windows

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.

Eksempler på procedurer

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 "$".

Kodning

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 ) 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 Procedure

Afkodning

Eksemplet 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 - funktion

Noter

  1. Brug af byteordensmærker . Dato for adgang: 18. februar 2016. Arkiveret fra originalen 22. januar 2016.

Links