Unicode Unikt vakkert eller unisont håpløst? En vandring gjennom tegnkodingens historie Dag Lamgmyhr, Ifi/UiO Ark 1 av 23
Hva er tegnkoding? Tegnkoding er bare å definere en tabell over hvilke tegn man har. Eller er det litt vanskeligere... I urtiden På de første datamaskinene bestemte brukeren hvilke tegn som skulle brukes når skriverne og punchemaskinene ble bestilt. Problem Kommunikasjon med andre. Dag Lamgmyhr, Ifi/UiO Ark 2 av 23
ASCII I 1963 kom American Standard Code for Information Interchange; etter noen iterasjoner var ANSI X3.4-1986 klar. Alle tegnsett definert senere (unntatt EBCDIC) bygger på ASCII. Teknologi og påvirkning Minst to teknologiske spor: Liten bokstav stor bokstav: Enten c 32 eller c 0xDF Tegnet DEL har kode 0x7F = 1111111 2. Dag Lamgmyhr, Ifi/UiO Ark 3 av 23
ASCII 00 10 20 30 40 50 60 70 00 0 @ P p 01! 1 A Q a q 02 " 2 B R b r 03 # 3 C S c s 04 $ 4 D T d t 05 % 5 E U e u 06 & 6 F V f v 07 7 G W g w 08 ( 8 H X h x 09 ) 9 I Y i y 0a * : J Z j z 0b + ; K [ k { 0c, < L \ l 0d - = M ] m } 0e. > N ^ n ~ 0f /? O _ o Dag Lamgmyhr, Ifi/UiO Ark 4 av 23
Problem ASCII er egentlig bare egnet for amerikansk engelsk, hawaiisk, latin og swahili. Resultat Utallige lokale varianter. ISO 646 Løsningen ble en ny standard med veldefinerte lokale tilpasninger: ISO 646. Dag Lamgmyhr, Ifi/UiO Ark 5 av 23
ISO 646-60 («norsk ASCII») 00 10 20 30 40 50 60 70 00 0 @ P p 01! 1 A Q a q 02 " 2 B R b r 03 # 3 C S c s 04 $ 4 D T d t 05 % 5 E U e u 06 & 6 F V f v 07 7 G W g w 08 ( 8 H X h x 09 ) 9 I Y i y 0a * : J Z j z 0b + ; K Æ k æ 0c, < L Ø l ø 0d - = M Å m å 0e. > N ^ n ~ 0f /? O _ o Dag Lamgmyhr, Ifi/UiO Ark 6 av 23
Spesielt Tegnet. Problem Importert utstyr og programmer måtte oversettes. #include <stdio.h> int main () æ printf("hei, alle sammen!øn"); å Uklare definisjoner: er en aksent eller et anførselstegn? Mange tegn mangler: «,»,... Dag Lamgmyhr, Ifi/UiO Ark 7 av 23
ISO 8859 Løsningen ble ISO 8859 som var et 8-bits tegnsett. Felles for alle variantene var at første halvpart alltid var ASCII. Dag Lamgmyhr, Ifi/UiO Ark 8 av 23
ISO 8859-1 (= Latin-1) 80 90 a0 b0 c0 d0 e0 f0 00 À Ð à ð 01 ± Á Ñ á ñ 02 ² Â Ò â ò 03 ³ Ã Ó ã ó 04 Ä Ô ä ô 05 µ Å Õ å õ 06 Æ Ö æ ö 07 Ç ç 08 È Ø è ø 09 ¹ É Ù é ù 0a ª º Ê Ú ê ú 0b Ë Û ë û 0c ¼ Ì Ü ì ü 0d - ½ Í Ý í ý 0e ¾ Î Þ î þ 0f Ï ß ï ÿ Dag Lamgmyhr, Ifi/UiO Ark 9 av 23
Ulike varianter ISO 8859-1 (Vesten) Latin-1 ISO 8859-2 Sentral- og Øst-Europa Latin-2 ISO 8859-3 Sydøst-Europa + diverse Latin-3 ISO 8859-4 (Skandinavia + Baltikum) Latin-4 ISO 8859-5 Kyrillisk ISO 8859-6 Arabisk ISO 8859-7 Gresk ISO 8859-8 Hebraisk ISO 8859-9 Tyrkisk Latin-5 ISO 8859-10 Nordkalotten (inkl samisk) Latin-6 ISO 8859-11 Thai ISO 8859-13 Baltikum Latin-7 ISO 8859-14 Keltisk Latin-8 ISO 8859-15 Vesten Latin-9 (Latin-0) ISO 8859-16 Rumensk Latin-10 Dag Lamgmyhr, Ifi/UiO Ark 10 av 23
Moderniseringer ISO 8859-1 manglet blant annet C, œ og Œ. Derfor laget man ISO 8859-15 med noen endringer: Den har ennå ikke slått an. ¼ ½ ¾ C Š š Ž ž Œ œ Ÿ Dag Lamgmyhr, Ifi/UiO Ark 11 av 23
Problem Umulig å ha flere tegnsett i samme fil. (Standarden ISO 2022 finnes for dette, men har vært lite brukt, heldigvis.) Selv 191 tegn er for lite. Stadig uklart om er anførselstegn eller aksent. Dag Lamgmyhr, Ifi/UiO Ark 12 av 23
Unicode Egentlig to standarder: ISO 10646 og Unicode. Opprinnelig var målet en 16-bits standard. Nå har man 17 plan som hver er på 16 bit. Man trenger altså 21 bit. Dette gir plass til 1 114 112 tegn; i versjon 4.0 er det definert 96 382 tegn. Men: Alt man egentlig trenger er i plan 0 kalt Basic Multilingual Plain (= BMP). (De øvrige kalles ofte astralplan!) Prinsipp Man lagrer kodepunkter for tegn, ikke symboler! (glyfer) a=a=a=a=... = U+0061 ASCII og ISO 8859-1 inngår som ekte delmengder. Dag Lamgmyhr, Ifi/UiO Ark 13 av 23
Hvordan lagre Unicode-tegn? UTF-32 (= UCS-4) Tegnet lagres i 32 bit (4 byte). Fordeler Enkelt Ulemper Tar mye plass. Hva med byte-rekkefølgen («big-endian» eller «little-endian»)? Løsninger er tegnet U+FEFF («Zero width no-break space»). Det kan settes inn i filen uten å gi synlig effekt, og det finnes intet tegn U+FFFE. Dag Lamgmyhr, Ifi/UiO Ark 14 av 23
UTF-16 (UCS-2) Denne koding er basert på at «Alle tegn ligger i plan 0 unntatt de som ikke ligger der.» Alle tegn i plan 0 lagres uendret i 16 bit. Andre tegn lagres som to tegn ved å splitte opp kodepunktet i 2 deler à 10 bit: ❶ 0xD800 + (c 0x10000) >>10 ❷ 0xDC00 + (c 0x10000) 0x3FF Dette går bra siden det ikke finnes tegn U+D800 U+DFFF og vi ikke har flere enn 17 plan. UTF-16 har samme problem med byte-rekkefølgen som UTF-32 og samme løsningen. Dag Lamgmyhr, Ifi/UiO Ark 15 av 23
UTF-8 (UCS-1) Her kodes tegn med 1 4 byte: ❶ 7 bit: 0xxxxxxx ❷ 11 bit: 110xxxxx 10xxxxxx ❸ 16 bit: 1110xxxx 10xxxxxx 10xxxxxx ❹ 21 bit: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ❺ osv (om nødvendig) Fordeler Meget kompakt. Ingen problemer med byte-rekkefølgen. Ulemper Ingen mulighet for indeksering. Dag Lamgmyhr, Ifi/UiO Ark 16 av 23
UTF-7 Denne koden brukes bare ved overføring av e-post. Hello, World! kodes som «Hello, World!». 1+1=2kodes som «1 +- 1 = 2». 1 kodes som «+AKM-1» der pundtegnet (U+00A3) kodes i UTF-16 som igjen kodes i Modified Base64 som «AKM». Dag Lamgmyhr, Ifi/UiO Ark 17 av 23
Problemer Tegn og symbol Hva er et tegn og hva er et symbol? Unicode er ikke konsekvent: 2 vs ²(U+00B2 i x²) vs «2.» (U+2489) vs... (U+22EF) σ vs ς Å (U+00C5) vs Å (U+212B for Ångström) Mange tegn mangler Ligaturer som fi og fl mangler samt andre tegn med typografisk formål som x Forskjellige definisjoner Mange tegn kan angis enten som et eget tegn eller som tegn med modifikator: é eller e+. Dag Lamgmyhr, Ifi/UiO Ark 18 av 23
Problem i Østen Unicode har nok gjort noen tabber for CJK-språkene: Han-tegnene ser ulike ut, men har samme Unicode-kodepunkt. Gaiji-tegn brukes i noen japanske navn, men finnes ikke i Unicode. Følgelig har disse landene lansert alternativer: TRON, UTF-2000, Giga Character Set (GCS). Dag Lamgmyhr, Ifi/UiO Ark 19 av 23
Det er andre problemer forbundet med en overgang: Programkode Det finnes millioner av programmer som antar at hvert tegn lagres i én byte. Java-produsentene har skjønt det: stream for å lese byte og reader for å oversette til tegn. Delvis implementasjoner Mange språk setter nå av 16 bit til tegn. Private felt Enkelte deler av Unicode er satt av til «privat bruk». Faren er at disse blir definert av ulik programvare. Mangelen på fonter Det er nå blitt en uoverkommelig jobb å lage en komplett font. De fleste fonter vil være ufullstendige på hver sin måte. Dag Lamgmyhr, Ifi/UiO Ark 20 av 23
Et generelt problem er: Hvordan få folk til å bruke riktig tegn: - U+2010 bindestrek U+2012 intervallstrek (1 4) U+2014 tankestrek U+2015 sitatstrek U+002D minus-tegn (a 1)... og hva skal en kompilator godta? Dag Lamgmyhr, Ifi/UiO Ark 21 av 23
I overgangsfasen I en overgangsfase vil det være spesielle problemer. Hvilken koding brukes? Det største problemet er: Hvilken koding brukes? Løsning 1: Legg det inn i filen: <!DOCTYPE HTML PUBLIC --*- coding: utf-8; -*-- "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/tr/html4/frameset.dtd"> <html> <head> <title>the ECOOP- Conference</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="content-language" content="en"> <link rel="shortcut icon" href="images/ecoop04-icon-alt.gif"> </head> Løsning 2: La leseprogrammet gjette. Dag Lamgmyhr, Ifi/UiO Ark 22 av 23
Status Hva er status? Nettlesere er kommet lengst der brukes Unicode i stor utstrekning. Kjernen i de fleste OS har tatt i bruk Unicode: Windows har brukt 16-bitsvarianten siden NT. Linux, OS/X og Solaris bruker UTF-8, også internt. Java (og andre språk) har tatt i bruk Unicode i hvert fall 16-bitsvarianten. Veldig få programmer vil tåle en overgang. Dag Lamgmyhr, Ifi/UiO Ark 23 av 23