Tekencodering

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
Chappe-telegraaf

Tekencodering beschrijft de techniek van het omzetten van tekens uit een bepaalde tekenset (ook wel codetabel genoemd) naar een code. Deze code kan bestaan uit natuurlijke getallen of morse, maar ook uit binaire getallen (of elektrische signalen) en wordt daarom veel gebruikt voor de opslag van tekens op computers en andere apparaten. Bij morse worden tekens uit het Latijns alfabet (letters) omgezet naar een serie korte en lange signalen die gebruikt kunnen worden bij een telegraaf. In computers worden allerlei tekens (waaronder letters, nummers en leestekens) met behulp van een tekenset zoals ASCII omgezet naar integers of bytes.

In de begindagen van computers en de invoering van tekensets zoals ASCII in 1963 en EBCDIC in 1964 werd begonnen met het proces van standaardiseren van tekencodering. Toen de beperkingen van deze sets al snel duidelijk bleken, werden er een aantal ad-hocmethodes uitgevonden om deze uit te breiden. Ook bleek de ondersteuning voor andere tekens en talen nodig, een voorbeeld hiervan zijn de CJK-systemen voor Chinese, Japanse en Koreaanse tekens. Hiervoor was door het grote aantal tekens een systematische aanpak nodig voor de tekencodering in tegenstelling tot de eerdere ad-hocmethodes.

Eenvoudige tekensets[bewerken]

Oorspronkelijk was de betekenis van tekenset en tekencodering hetzelfde, dezelfde standaard bepaalde namelijk zowel welke tekens beschikbaar waren, als hoe deze tekens omgezet moesten worden in code-eenheden (meestal een teken per eenheid uit de code). Hierdoor gebruiken MIME en hierop gebaseerde systemen nog steeds de term tekenset voor het complete systeem voor het omzetten van tekens naar code.

Moderne codering[bewerken]

Unicode en de standaard die hierbij hoort, ISO 10646 Universele tekenset, de modernste vorm van tekencodering, gebruiken een andere aanpak. De beschikbare tekens en de nummering, de manier waarom de tekens worden gecodeerd als code-eenheden en daarna bytes, worden hierbij gescheiden. Het idee achter deze scheiding is dat er een verzameling universele tekens wordt vastgesteld, die op verschillende manieren kan worden gecodeerd. Het systeem is hierdoor ook te complex om te worden uitgedrukt in de termen tekenset of tekencodering:

Een tekenrepertoire (character repertoire) is de volledige verzameling abstracte tekens die het systeem ondersteunt. Dit kan gesloten zijn, waardoor er dus geen nieuwe toevoegingen meer toegestaan zijn zonder een nieuwe standaard te ontwerpen, zoals bij ASCII en de meeste ISO-8859-systemen. Maar het tekenrepertoire kan ook open zijn, waarbij toevoegingen wel zijn toegestaan, zoals bij Unicode en in beperkte mate bij de codepagina's voor Windows. De tekens in een repertoire representeren de keuzes die zijn gemaakt over het omzetten van schriften in lineaire informatie-eenheden. De simpele varianten van het Latijns, Grieks en cyrillisch alfabet kunnen versimpeld tot letters, getallen, leestekens en een aantal andere tekens, omgezet in eenvoudige lineaire rijen en weergegeven in dezelfde richting waarin ze gelezen worden. Maar zelfs bij deze alfabetten wordt het omzetten al lastiger met accenttekens, deze kunnen namelijk worden gezien als enkel teken (letter met accent) of als aparte tekens. Het eerste geval maakt het werken met de tekst eenvoudiger, maar het tweede geval maakt alle combinaties van letters en accenten mogelijk. In andere schriften, zoals Arabisch of Hebreeuws, worden veel complexere tekenrepertoires gebruikt om om te kunnen gaan met eigenschappen zoals tweerichtingstekst en glyfen die worden samengevoegd op verschillende manieren in verschillende situaties.

Een gecodeerde tekenset beschrijft het omzetten van tekens naar positieve getallen die ook wel codepunten worden genoemd. Bijvoorbeeld, in een bepaald repertoire wordt het teken voor de hoofdletter "A" uit het Latijns alfabet omgezet naar het getal 65, het teken "B" naar 66, enzovoorts. Een gecodeerde tekenset bestaat uit de complete verzameling van de tekens en de bijbehorende getallen. Verschillende gecodeerde tekensets kunnen dezelfde tekenrepertoires gebruiken, maar ze omzetten naar andere getallen, zoals het geval is in ISO-8859-1 en IBM codepagina's 037 en 500. In een gecodeerde tekenset wordt ieder codepunt maar voor één teken gebruikt.

Een tekencoderingsvorm (CEF) beschrijft het omzetten van de codes van een gecodeerde tekenset naar een verzameling getallen met een beperkte lengte (codewaarden), die de opslag eenvoudiger maken in een binair systeem met een beperkt aantal bits (bijna ieder computersysteem). Bijvoorbeeld, een systeem dat getallen opslaat in 16-bits eenheden is alleen in staat om getallen te gebruiken tussen 0 en 65.535 in iedere eenheid. Grotere getallen zijn mogelijk wanneer er meerdere eenheden worden gebruikt, en dit is wat CEF doet, het beschrijft een manier om een enkele codepunt tussen bijvoorbeeld 0 en 1,4 miljoen om te zetten naar een serie codewaarden tussen bijvoorbeeld 0 en 65.565.

Het eenvoudigste CEF-systeem kiest eenheden die groot genoeg zijn om codes uit de gecodeerde tekenset direct te coderen (een codepunt naar een codewaarde). Dit werkt goed voor gecodeerde tekensets die passen in 8-bits codewaarden (zoals de meeste niet-CJK-coderingen), en redelijk voor groottes van 16-bits, maar bij grotere sets (zoals het moderne Unicode met 21 bits per teken) wordt het steeds minder efficiënt. Ook is het lastig bestaande systemen aan te passen om grotere codewaarden te gebruiken. Daarom werken veel moderne systemen die latere versies van Unicode gebruiken met UTF-8, dat Unicode codepunten omzet naar rijen van bytes (8-bits) met een variabele lengte, of met UTF-16, dat met rijen van 16-bits (ook wel words genoemd) met variabele lengte werkt.

Hierna stelt het tekencoderingsschema (CES) vast hoe de codes met een vaste lengte omgezet moeten worden naar rij bytes, geschikt voor opslag op een bytegebaseerd bestandssysteem of verzending over een bytegebaseerd netwerk. Bij Unicode wordt hiervoor meestal een eenvoudig tekencoderingsschema gebruikt, dat simpelweg aangeeft of de bytes van het getal in big- of little-endian-volgorde staan (zelfs dit is niet nodig bij UTF-8). Maar er zijn ook samengestelde tekencoderingsschema's die speciale combinaties van tekens (escape sequences) gebruiken om te wisselen tussen eenvoudige systemen (zoals ISO 2022). En er zijn compressieschema's die het aantal bytes per code-eenheid proberen te beperken (zoals SCSU, BOCU en Punycode).

En er kan een hoger niveau protocol zijn, dat extra informatie geeft om een bepaalde variant van een Unicode-teken te selecteren, vooral wanneer er regionale varianten zijn samengevoegd als een enkel teken in Unicode. Een voorbeeld van extra informatie is het XML attribuut xml:lang.

Geschiedenis van tekencoderingen[bewerken]

Veelgebruikte tekencoderingen[bewerken]

    0 1 2 3 4 5 6 7 8 9 A B C D E F
40     â ä à á ã å ç ñ [ . < ( + !
50   & é ê ë è í î ï ì ß ] $ * ) ; ^
60   - / Â Ä À Á Ã Å Ç Ñ ¦ , % _ > ?
70   ø É Ê Ë È Í Î Ï Ì ` : # @ ' = "
80   Ø a b c d e f g h i « » ð ý þ ±
90   ° j k l m n o p q r ª º æ ¸ Æ ¤
A0   µ ~ s t u v w x y z ¡ ¿ Ð Ý Þ ®
B0   ¢ £ ¥ · © § ¼ ½ ¾ ¬ | ¯ ¨ ' ×
C0   { A B C D E F G H I ­ ô ö ò ó õ
D0   } J K L M N O P Q R ¹ û ü ù ú ÿ
E0   \ ÷ S T U V W X Y Z ² Ô Ö Ò Ó Õ
F0   0 1 2 3 4 5 6 7 8 9 ³ Û Ü Ù Ú