Naar inhoud springen

Unicode

Uit Wikipedia, de vrije encyclopedie
(Doorverwezen vanaf Unicode 6.0)

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 logo

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.

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.

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.

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[1]
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

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.

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.

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).

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]

[bewerken | brontekst bewerken]
Zie de categorie Unicode van Wikimedia Commons voor mediabestanden over dit onderwerp.