# Tekencodering

Tekencodering is de koppeling van tekens uit een bepaalde tekenset aan een code. Deze koppeling en de weergave daarvan worden ook wel een codetabel genoemd. De 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 bepaalt de tekencodering hoe de tekens (waaronder letters, cijfers, leestekens en spaties, maar ook enkele stuurcodes zoals tab, carriage return en line feed) die in platte tekst kunnen voorkomen, worden gerepresenteerd in bytes.
De precieze werking van de stuurcodes valt niet onder tekencodering. Met name geldt dit ook voor de vraag of carriage return, line feed of de combinatie daarvan wordt gebruikt als nieuweregelteken.
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.

## Tekenset versus tekencodering

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.

## Eenvoudige tekensets

Soms wordt nog steeds een eenvoudige tekenset gebruikt. Pathé Nederland gebruikt in het betalingsverkeer (naam rekeninghouder en omschrijving transactie) bijvoorbeeld de naam "Pathe". Banken garanderen niet altijd dat diakritische tekens goed verwerkt worden, en ook bij de diverse software die klanten gebruiken, voorkomt dit complicaties.
Ook in URL's en e-mailadressen worden diakritische tekens vaak weggelaten.

## Unicode

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 waarop 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 gliefen 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 (character encoding form, 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 (character encoding scheme, 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.

## E-mail

Bij het per e-mail versturen van platte tekst naar een computer met een andere tekencodering kan men onderscheiden:
* versturen van een tekstbestand als bijlage: de bytes blijven gelijk, de tekens niet allemaal (het euroteken uit de ANSI-tekenset is bijvoorbeeld niet meer leesbaar; om dit te voorkomen kan het helpen een Unicode-versie te versturen)
* versturen van de tekst in de e-mail zelf: meer kans dat de tekens intact blijven (voor zover ze door het andere systeem ook worden ondersteund), door de omzettingen die de mailprogramma's doen

## Geschiedenis van tekencoderingen

* I Ching China
* Ogham Ierland
* Braille internationaal

## Enkele tekencoderingen

| | | 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 | ³ | Û | Ü | Ù | Ú | |
* ISO 646
** ASCII
* EBCDIC (zie de tabel)
* GBCD
* ISO 8859:
** ISO 8859-1, ISO 8859-2, ISO 8859-3, ISO 8859-4, ISO 8859-5, ISO 8859-6, ISO 8859-7, ISO 8859-8, ISO 8859-9, ISO 8859-10, ISO 8859-11, ISO 8859-13, ISO 8859-14, ISO 8859-15, ISO 8859-16
** CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869
* Windows tekensets:
** Windows-1250 voor Centraal-Europese talen die het Latijnse schrift gebruiken (Pools, Tsjechisch, Slowaaks, Hongaars, Sloveens, Kroatisch, Roemeens en Albanees)
** Windows-1251 voor Cyrillische alfabetten
** Windows-1252 voor Westerse talen
** Windows-1253 voor Grieks
** Windows-1254 voor Turks
** Windows-1255 voor Hebreeuws
** Windows-1256 voor Arabisch
** Windows-1257 voor Baltische talen
** Windows-1258 voor Vietnamees
* Mac OS Roman
* KOI8-R, KOI8-U, KOI7
* MIK
* Cork of T1
* ISCII
* VISCII
* Big5 (een bekende variant is Microsoft Codepagina 950)
** HKSCS
* Guobiao
** GB2312
** GBK (Microsoft Codepagina 936)
** GB18030
* Shift JIS voor Japans (Microsoft Codepagina 932)
* EUC-KR voor Koreaans (Microsoft Codepagina 949)
* ISO-2022 en EUC voor CJK tekensets
* Unicode (en subsets daarvan, zoals het 16-bit 'Basic Multilingual Plane'). Zie:
** UTF-8
** UTF-16
** UTF-32
* ANSEL of ISO/IEC 6937