# Unicode

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 (= 2$^{16}$) 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.
| Versie | Datum | Aantal tekens | ISBN | Opmerking |
| 1.0 | oktober 1991 | 7.161 | 0-201-56788-1 | Eerste versie met Arabisch, Armeens, Bengaals, Bopomofo, Cyrillisch, Devanagari, Georgisch, Grieks met Koptisch, Gujarati, Gurmukhi, Hangul, Hebreeuws, Hiragana, Kannada, Katakana, Laotiaans, Latijns, Malayalam, Odia, Tamil, Telugu, Thais en Tibetaans. |
| 1.0.1 | juni 1992 | 28.359 | 0-201-56788-1 | Aantal tekens toegevoegd om te voldoen aan ISO/IEC 10646-1. Dit zijn de "CJK"-tekens voor de Chinese, Japanse en Koreaanse schriften. |
| 1.1 | juni 1993 | 34.233 | | Nieuwe tekens toegevoegd om te voldoen aan de bijgewerkte ISO/IEC 10646-1. Dit houdt meer Hangul-tekens in. |
| 2.0 | juli 1996 | 38.950 | 0-201-48345-9 | 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. |
| 2.1 | mei 1998 | 38.952 | | Euroteken toegevoegd |
| 3.0 | september 1999 | 49.259 | 0-201-61633-5 | O.a. Cherokee, Khmer, Mongools, Birmees, Ogham, ... |
| 3.1 | maart 2001 | 94.205 | | Zeer veel Chinese (CJK) karakters toegevoegd |
| 3.2 | maart 2002 | 95.221 | | Enkele Filipijnse schriften toegevoegd (onder andere Baybayin) |
| 4.0 | april 2003 | 96.447 | 0-321-18578-1 | Hexagram-symbolen, Lineair B, ... |
| 4.1 | maart 2005 | 97.720 | | O.a. Tifinagh toegevoegd |
| 5.0 | juli 2006 | 99.089 | 0-321-48091-0 | Balinees, Spijkerschrift, N'Ko, ... toegevoegd |
| 5.1 | april 2008 | 100.713 | | O.a. Soendanees, Saurashtra, ... en ook tekens voor Mahjong en Domino en de Schijf van Phaistos |
| 5.2 | oktober 2009 | 107.296 | 978-1-936213-00-9 | O.a. Avestisch, Bamoun, ... |
| 6.0 | oktober 2010 | 109.242 | 978-1936213-01-6 | 2088 nieuwe karakters, van onder andere Batak, Brahmi, Mandaïsch en een aantal symbolen en emoticons |
| 6.1 | januari 2012 | 110.181 | | onder andere Chakma, Sharada, ... toegevoegd |
| 6.2 | september 2012 | 110.182 | | ISO/IEC 10646:2012 + Het Turkse lira-teken toegevoegd |
| 6.3 | september 2013 | 110.187 | | 6 nieuwe tekens |
| 7.0 | juni 2014 | 113.021 | | Bassa, Kaukasisch Albanees, Duployaans, Elbasan, Grantha, Khojki, Khudabadi, Lineair A, Mahajani, Manichees, Mende Kikakui, Modi, Mro, Nabatees, Oudnoordarabisch, Oud-Permisch, Pahawh Hmong, Palmyreens, Pau Cin Hau, Psalter Pahlavi, Siddhaṃ, Tirhuta, Warang Citi, Dingbats. |
| 8.0 | juni 2015 | 120.737 | | o.a. Ahom, Anatolische hiërogliefen, Hatran, Multani, Oudhongaars, SignWriting |
| 9.0 | juni 2016 | 128.237 | | o.a. Adlam, Bhaiksuki, Marchen, Newa, Osage, Tangut |
| 10.0 | juni 2017 | 136.755 | | o.a. Masaram Gondi, Nüshu, Soyombo, Hentaigana, Bitcoin |
| 11.0 | juni 2018 | 137.374 | | o.a. Dogri, Hanifi Rohingya, Copyleft |
| 12.0 | maart 2019 | 137.993 | | o.a. Laotiaans schrift, uitbreidingen Tamil, Hiragana en Katakana |
| 13.0 | maart 2020 | 143.924 | | o.a. Jezidi, Chorasmisch, Divehi Akuru, Kitan; 55 nieuwe emoji |
| 14.0 | september 2021 | 144.762 | | |
| 15.0 | september 2022 | 149.251 | | |
| 15.1 | september 2023 | 149.878 | | |
| 16.0 | september 2024 | 155.063 | | |

## Codering

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).
| Codegebied hexadecimaal | UTF-32 binair | UTF-16 binair | UTF-8 binair | Opmerkingen |
| U+0000..U+007F (128 = 0x80 ASCII-equivalenten) | 00000000 00000000 00000000 0aaaaaaa | 00000000 0aaaaaaa | 0aaaaaaa | |
| U+0080..U+07FF (1.920 = 0x780 scalaire waarden) | 00000000 00000000 00000bbb aaaaaaaa | 00000bbb aaaaaaaa | 110bbbaa 10aaaaaa | |
| U+0800..U+D7FF en U+E000..U+FFFF (61.440 = 0xF000 scalaire waarden, de resterende in het Basic Multilingual Plane) | 00000000 00000000 bbbbbbbb aaaaaaaa | bbbbbbbb aaaaaaaa | 1110bbbb 10bbbbaa 10aaaaaa | |
| U+010000..U+10FFFF (1.048.576 = 0x100000 supplementaire codepunten) | 00000000 000ccccc bbbbbbbb aaaaaaaa | 110110dd ddbbbbbb 110111bb aaaaaaaa | 11110ccc 10ccbbbb 10bbbbaa 10aaaaaa | dddd = ccccc − 1 |
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 &#65; (decimaal) of &#x41; (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.