Unicode is een internationale standaard (nauw samenhangend met ISO-10646) voor de codering van grafische tekens en symbolen in binaire codes, vergelijkbaar met de ASCII-standaard. De standaard voorziet alle tekens van alle geschreven talen van een naam (in de standaard in hoofdletters geschreven) en een nummer (vaak hexadecimaal geschreven, voorafgegaan door U+). Er is bijvoorbeeld het teken LATIN CAPITAL LETTER A met nummer U+0041 (65), los van de lettertypes waarin het weergegeven kan worden. De grafische weergave per lettertype behoort niet tot de standaard.
De standaard wordt onderhouden door het Unicode Consortium. In tegenstelling tot ASCII (alleen Engels) of Latin-1 (alleen West-Europese talen) heeft Unicode als doel alle gebruikte schriften (zoals het Griekse schrift en Chinese karakters) te ondersteunen. De standaard bevat ruim 100.000 gestandaardiseerde tekens en ongeveer 900.000 voor toekomstig gebruik gereserveerde codes. De Unicode standaard schrijft niets voor over de visuele representatie van een karakter.
Unicode stelt geen beperkingen aan het aantal talen dat in één enkel document gebruikt kan worden. Naast letters en cijfers bevat Unicode ook veel symbolen, zoals: kruisen, wiskundige tekens, muntsymbolen enzovoort. Unicode bevat geen symbolen die niet in een schrift worden gebruikt, zoals verkeersborden. Enkele "tekens" in Unicode zijn zelf geen grafische tekens, maar hebben betekenis voor de wijze waarop de zichtbare tekens geplaatst worden, zoals carriage return, line feed, spatie en de niet-afbrekende spatie (harde spatie ofwel NBSP, wat staat voor het Engelse non-breaking space).
Een neveneffect bij omzetting van gegevens die anders gecodeerd waren, is dat bij sorteren op numerieke volgorde een ander resultaat (space, numeric, uppercase, lowercase (SNUL)) dan bijvoorbeeld bij EBCDIC (space, lowercase, uppercase, numeric (=SLUN)) verkregen wordt, omdat de tekens anders gerangschikt zijn.
Geschiedenis
Bij de eerste computers waren alle teksten (programma's en in- en uitvoer) in hoofdletters, met als verdere tekens cijfers, leestekens en dergelijke, zie bijvoorbeeld GBCD. Later werden kleine letters toegevoegd, zie bijvoorbeeld ASCII. Deze 7-bits code (8-bits zijn samen 1 byte) bevat alleen de Latijnse letters zonder diakritische tekens. Het lag daarom voor de hand ASCII uit te breiden tot extended ASCII met een achtste bit, maar er was niet genoeg ruimte voor alle tekens in alle talen met het Latijnse schrift. Daarom kregen veel talen hun eigen variant van extended ASCII en er was ook EBCDIC. Er is geen standaardmethode om aan te geven welke variant gebruikt wordt, zo gebeurt dit in HTML anders dan in e-mail, en in platte tekst kan het al helemaal niet, wat veel spraakverwarring oplevert.
Voor veel schriften, zoals het Chinese, Arabische en Japanse schrift, zijn 256 tekens niet voldoende. Voor deze uitgebreidere tekenverzamelingen worden traditioneel al andere coderingen gebruikt, die ruimte voor meer tekens bevatten.
Zelfs met al deze verschillende coderingen voor de verschillende talen was het nog niet mogelijk om over een vreemde taal te schrijven. Wanneer men in een Chinese tekst over het Arabisch wilde schrijven, kon men dat niet in de standaard-Chinese codering: de Arabische letters zijn daarin namelijk niet opgenomen. Unicode en de daarvoor beschikbare coderingen bieden voor al dit soort problemen uitkomst.
Versies
De Unicodestandaard is ontstaan op initiatief van een aantal organisaties die orde wilden scheppen in de chaos van tekencoderingen. In 1991 lanceerden zij hun eerste standaard: Unicode 1.0.
Unicode 1.1 had ruimte voor 65.536 (= 216) tekens. Dit aantal bleek echter te weinig om alle schriften van de wereld te kunnen ondersteunen. Zo bestaat alleen het Chinese schrift al uit zo'n 25.000 tekens.
In Unicode 2.0 werd het aantal codes uitgebreid naar ruim een miljoen, zie ook onder.
Eerste versie van Unicode die meer dan 65.536 tekens ondersteunt. De Hangul-tekens verwijderd en een grotere reeks opnieuw toegevoegd op een andere locatie.
De Unicodestandaard kent aan elk teken een nummer toe, codepunt genoemd, dat geschreven wordt als U+xxxx, waarin de x'en de hexadecimale cijfers van het codepunt zijn (minimaal vier, zo nodig met voorloopnullen, maximaal zes). De codepunten die gekoppeld zijn of kunnen worden aan een teken (de zogenaamde Unicode scalaire waarden) lopen van U+0000 (0) tot en met U+D7FF (55.295) en van U+E000 (57.344) tot en met U+10FFFF (1.114.111). Dat zijn 55.296 + 8.192 = 63.488 (0xF800) tekens met een codepunt tot en met twee bytes, plus 1.048.576 (0x100000) andere, in totaal 1.112.064 (0x10F800). De onderbreking bestaat uit 2048 (0x800) codepunten die ten behoeve van gunstige eigenschappen van de UTF-16-codering niet gebruikt worden; ze worden surrogaatcodepunten genoemd.
Unicode biedt verschillende coderingsvormen (encoding forms) om de scalaire waarden te representeren, onder andere:
UTF-32: Een code-eenheid (code unit) heeft 32 bits. Tekens worden opgeslagen in één code-eenheid. Een nadeel is dat ook kleine scalaire waarden vier bytes vergen.
UTF-16: Een code-eenheid heeft 16 bits. Tekens worden opgeslagen in een of twee code-eenheden, de lagere in een, de hogere in twee. UTF-16 is een uitbreiding van UCS-2, de codering van Unicode t/m versie 1.1. Voor de tekens die worden opgeslagen in twee code-eenheden worden alleen de 2048 16-bits getallen gebruikt die niet afzonderlijk worden gebruikt voor de opslag van een teken. Daardoor blijven er 63.488 16-bits getallen over voor opslag van een teken in één code-eenheid. Van de genoemde 2048 16-bits getallen worden er 1024 uitsluitend gebruikt als eerste van de twee 16-bits getallen die een teken representeren, en 1024 uitsluitend als tweede, wat 1.048.576 combinaties oplevert, voor even zoveel scalaire waarden. Zo'n combinatie wordt een surrogaatpaar genoemd.
UTF-8: Een code-eenheid heeft 8 bits. Tekens worden opgeslagen in een tot vier code-eenheden, hoe groter de scalaire waarde hoe meer. Voor de tekens die worden opgeslagen in twee tot vier code-eenheden, worden niet de 128 8-bits getallen gebruikt die afzonderlijk worden gebruikt voor de opslag van een teken. Van de resterende 128 8-bits getallen worden er 64 uitsluitend gebruikt voor de vervolg-8-bits getallen voor tekens die worden opgeslagen in twee tot vier code-eenheden. Van de resterende 64 8-bits getallen worden er 32 uitsluitend gebruikt voor het eerste 8-bits getal voor de 1920 tekens die worden opgeslagen in twee code-eenheden, 16 uitsluitend voor het eerste 8-bits getal voor de 61.440 tekens die worden opgeslagen in drie code-eenheden, 8 uitsluitend voor het eerste 8-bits getal voor de 1.048.576 tekens die worden opgeslagen in vier code-eenheden, en 8 niet gebruikt. In deze codering worden ASCII-tekens onveranderd gecodeerd, en vergen daardoor minder geheugen dan met UTF-16 (een in plaats van twee bytes), maar vrij grote scalaire waarden vergen meer geheugen (drie in plaats van twee bytes).
Aangezien computers de data in een code-eenheid die meerdere bytes beslaat, op verschillende wijzen kunnen opslaan, zijn er van UTF-32 en UTF-16 twee varianten mogelijk, namelijk big-endian, waarbij de meest significante byte zich op het laagste adres bevindt, en little-endian, met de minst significante byte eerst.
De 256 tekens van ISO-8859-1 zijn in Unicode onder dezelfde codes opgenomen: U+0000 t/m U+00FF. De tweede 128 hiervan worden echter in Unicode in geen van de drie coderingsvormen in één byte gerepresenteerd. Ook andere codepagina's van ISO 8859 vindt men in Unicode terug, waarbij de oorspronkelijke tekenvolgorde gehandhaafd is.
Sorteren
Het sorteren van tekens op basis van de scalaire waarde komt bij UTF-32 en UTF-8 overeen met het sorteren op de daarbij behorende (big-endian) bytereeksen (in de zin dat 0x01 0x00 vóór 0x02 komt omdat 0x01 vóór 0x02 komt). Dit geldt voor UTF-16 niet wanneer er tekens van zowel het Basic Multilingual Plane als van een ander plane vergeleken worden.
Gebruik
In HTML- en XML-documenten kunnen Unicode-tekens die niet worden ondersteund in de gebruikte karaktercodering, worden ingevoegd via karakter-entiteitreferenties. Zo wordt de hoofdletter A weergegeven door A (decimaal) of A (hexadecimaal).
Schriften
In september 2020 voorziet Unicode in tekens voor 154 schriften, onder andere de onderstaande:
Het aantal schriften wordt nog voortdurend uitgebreid. Ook veel historische schriften worden opgenomen. De volledige lijst kan worden geraadpleegd op de Unicode-website.[2]