UTF-8

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

UTF-8 (8-bit Unicode Transformation Format) is een manier om Unicode/ISO 10646-tekens op te slaan als een stroom van bytes, een zogenaamde tekencodering. Alternatieven zijn UTF-16 en UTF-32.

UTF-8 is een tekencodering met variabele lengte: niet elk teken gebruikt evenveel bytes. Afhankelijk van het teken worden 1 tot 4 bytes gebruikt. Voor het vastleggen van elk van de 128 ASCII-tekens is slechts één byte nodig.

Beschrijving[bewerken]

UTF-8 is gestandaardiseerd als RFC 3629 (UTF-8, a transformation format of ISO 10646).

Samenvattend worden de Unicodetekens in groepen bits ingedeeld, die worden verdeeld over de lage bits van de UTF-8-bytes.

De tekens U+0000..U+007F, de ASCII-tekens, kunnen direct worden gecodeerd in een byte met het hoogste bit 0. Voor alle andere tekens zijn 2 tot 4 bytes nodig. Alle bytes voor zulke tekens hebben het hoogste bit 1, zodat verwarring met de ASCII-tekens wordt voorkomen.

In dat laatste geval zijn bij het eerste byte de hoogste twee bits gelijk aan '11' en bij de volgende byte(s) '10'. Hierdoor kan altijd het eerste byte van een in UTF-8 gecodeerd teken worden herkend. De positie van de hoogste '0' in het eerste byte geeft aan uit hoeveel bytes de code is samengesteld.

Codegebied
hexadecimaal
UTF-32
binair
UTF-16
binair
UTF-8
binair
Opmerking over de UTF-8-code
U+0000..U+007F 00000000 00000000
00000000 0aaaaaaa
00000000 0aaaaaaa 0aaaaaaa ASCII-equivalenten; byte begint met nulbit
U+0080..U+07FF 00000000 00000000
00000bbb aaaaaaaa
00000bbb aaaaaaaa 110bbbaa 10aaaaaa eerste byte begint met 110, tweede met 10
U+0800..U+FFFF 00000000 00000000
bbbbbbbb aaaaaaaa
bbbbbbbb aaaaaaaa 1110bbbb 10bbbbaa 10aaaaaa eerste byte begint met 1110, volgende met 10
U+010000..U+10FFFF 00000000 000ccccc
bbbbbbbb aaaaaaaa
110110dd ddbbbbbb
110111bb aaaaaaaa
11110ccc 10ccbbbb 10bbbbaa 10aaaaaa eerste byte begint met 11110, volgende met 10,
dddd = ccccc - 1

Toegestane karakters[bewerken]

Volgens de oorspronkelijke specificatie kon een UTF-8-code uit maximaal zes bytes bestaan. Om compatibiliteit met UTF-16 te garanderen werd dit verkort tot maximaal vier bytes en werd U+10FFFF het hoogste toegestane Unicodeteken. Ook worden de tekens U+D800..U+DFFF, die in UTF-16 niet gecodeerd kunnen worden, als ongeldig beschouwd in UTF-8, ook al zou codering wel mogelijk zijn.[bron?]

Wanneer een teken op meerdere manieren kan worden gecodeerd is alleen de kortste vorm toegestaan. Unicode U+007F kan bijvoorbeeld in UTF-8 worden gecodeerd als 7F maar ook als de ongeldige reeks C1 BF.[bron?]

Een omzetter voor UTF-8-code dient tekst met ongeldige codes te verwerpen vanwege beveiligingsrisico's.[bron?]

Voordelen[bewerken]

  • In ASCII gecodeerde tekst is ongewijzigd geldig als UTF-8-tekst.
  • Doordat de letters uit het Latijnse alfabet slechts 1 byte in beslag nemen, is UTF-8 voor westerse talen compacter dan het eenvoudigere UTF-16. Textbestanden met opmaaktaal zoals HTML of XML (i.h.b. bestanden in het docx- of odf-formaat), bevatten daarnaast veel codewoorden in ASCII, ook voor bestanden in niet-westerse talen.
  • UTF-8 is onafhankelijk van de endianness van de computer (in tegenstelling tot UTF-16) en daardoor geschikter als uitwisselingsformaat.
  • Het is veel eenvoudiger Unixsystemen compatibel te maken met UTF-8 dan met UTF-16, bijvoorbeeld doordat programma-API's voor de programmeertaal C ongewijzigd kunnen blijven (zowel in ASCII als in UTF-8 kan een string worden behandeld als een nul-getermineerde char*, een UTF-16-string bevat gewoonlijk veel nulbytes en wordt meestal behandeld als een short*).
  • UTF-8-strings kunnen worden gesorteerd alsof het bytestrings zijn.
  • Woordbreekroutines voor ASCII werken met UTF-8 correct zonder wijziging.
  • Bestandsnaamroutines voor ASCII werken met UTF-8 correct (alle speciale tekens in bestandsnamen en paden zijn ASCII-tekens)
  • Doordat het eerste byte aangeeft in hoeveel bytes een teken gecodeerd is, is de variabele lengte van de tekens in UTF-8 gemakkelijk te decoderen. Doordat bovendien vervolgbytes als zodanig onderscheidbaar zijn, kan een teken niet als deelreeks van een ander teken gecodeerd zijn, zodat zoekacties geen onjuiste resultaten kunnen opleveren ook al wordt niet vanaf het begin van de tekst gezocht.

Nadelen[bewerken]

  • De variabele lengte maakt het in veel programmeertalen lastiger direct met tekenreeksen te werken. Dit kan worden opgelost door hiervoor de juiste bibliotheken te gebruiken. Bijvoorbeeld in Flash is het commando System.useCodepage=true nodig om UTF-8 te kunnen gebruiken.
  • Veel Oost-Aziatische tekens gebruiken 3 bytes in UTF-8 terwijl ze slechts 2 bytes zouden gebruiken in UTF-16. Hierdoor worden tekstbestanden in deze talen groter dan in UTF-16.

Gebruik[bewerken]

UTF-8 werd in 1993 geïntroduceerd. Rond het jaar 2000 stapten de op Linux gebaseerde distributies over naar UTF-8 als standaard voor alle tekstbestanden (inclusief scriptbestanden). Aan de bestanden zelf is niet te zien of deze in UTF-8 gecodeerd zijn. Dat blijkt pas bij het bekijken van de tekst.

Microsoft was eerder al op UTF-16 overgegaan maar heeft ook UTF-8 toegevoegd. Indien in Microsoft Windows platte tekst in UTF-8 wordt opgeslagen, voegen Microsoftprogramma's de drie bytes 0xEF, 0xBB, 0xBF, de UTF-8-code voor U+FEFF, aan het begin van het bestand toe, het "Byte Order Mark", of kortweg "BOM", dat echter niet altijd door andere programma's goed herkend wordt.

Webpagina's kunnen ook UTF-8 gebruiken. In de broncode van de webpagina's wordt dan aangegeven dat het om UTF-8-code gaat. De meeste websitemakers geven de voorkeur aan UTF-8, omdat dit bij andere talen minder onduidelijkheden geeft dan de ASCII- of ANSI-codering. Wikipedia gebruikt bijvoorbeeld UTF-8 voor de broncode van de webpagina's en ook in e-mail wordt steeds vaker UTF-8 gebruikt.[1]

Externe link[bewerken]

Bronnen, noten en/of referenties