2005-05-02
 
HELSINKI - Zondagavond. Heerlijk ontspannen. Ik heb hardgelopen, gedoucht en een hapje gegeten. En ik ben wat aan mijn hobbyprojectjes aan het werken; ik heb een nieuwe versie uitgebracht van sendxmpp (command-line xmpp client).

Ik luister wat naar de brute Russische ska van Leningrad (meer dan een paar liedjes verdraagt mijn ska-tolerantie niet, maar tot dan is het best leuk). Dan zijn er nog de Litouwse oppergothen van Siela met hun suïsymphonieën, of de landgenoten van Girnu Giesmes, die het beeld oproepen van groepen Homo Sapiens en Neanderhalers die elkaar met vuistbijlen te lijf gaan, tegen een een achtergrond van zwarte lucht en bliksemschichten die de hemel doorklieven (aldus Jorn:-), maar die heb ik niet kunnen beluisteren. het oerbeeld komt me bekend voor trouwens, zit dat in een film? Of iets uit een vorig leven?

Zaterdagavond was de tijd om de voetjes een beetje van de vloer te krijgen. Ik trok inderdaad mijn oranje shirt aan, en trof in de stad een grote groep mensen aan in diverse uitdossingen. Meest in het oog springend waren de witte matrozenpetjes waarmee menigeen zich meende te moeten tooien. Het bleek dat studenten en oud-studenten daar op de avond van de 30e april een gewoonte van maken. Het zag er nogal belachelijk uit. Nou ja, het hele festijn verliep in goede sfeer. Net als de Koninginnenach in Den Haag; daar waren weliswaar 42 arrestaties, maar de politie sprak over een 'rustige nacht'. Huh?! Nederland is ver weg.

Ik besloot de lokale rockbar On the Rocks te bezoeken; ik was er al enkele malen eerder geweest. Ik was echter nooit verder gekomen dan de bovengrondse bar. Je kunt echter via een trap afdalen in een rockgrot waar langharig Helsinki zich tegoed doet aan de klanken van Guns 'n' Roses, Nirvana en Pantera. Een metaalhymne als Metallica's Ride the Lightning (1984) wordt uit volle borst meegezongen - flash before my eyes - now it's time to die. Prachtig. Vanuit mijn machtige plek aan de bar overzag ik het slagveld op de dansvloer. De Finse vrouwen (in ieder geval het deel aldaar verzameld) bleek er nogal brute benaderingstechnieken op na te houden. De eerdergenoemde vuistbijlen kwamen er nog net niet aan te pas.

Gelukkig kon ik mijn spreekwoordelijke :-) koelheid grotendeels bewaren, en ging ik uiteindelijk toch maar alleen terug naar mijn Palazzo. Met de bus natuurlijk, en ditmaal was ik vastbesloten mijn vergissing van een maand geleden niet te herhalen, en de juiste bus te nemen :-) Met enige moeite lukte dat ook, en de bus vertrok in de juiste richting, en ik was aan boord. Maar, ditmaal viel ik in slaap(!) en werd weer wakker toen de bus weer bij het beginpunt was. Natuurlijk was het ook de allerlaatste bus, waardoor ik alsnog dat hele roteind naar huis moest lopen! Nou ja, dat sterkt het karakter...

karakter

De meest wijdverbreide standaard voor karaktercodes is natuurlijk ASCII ("US-ASCII"), voor codes 0-127. Die zegt echter niets over 'bijzondere' tekens zoals ä en €. 'Bijzondere' tekens zijn echter heel gewoon, zeker wanneer Russische, Thaise, Koreaanse, .... schriften in aanmerking worden genomen. Al die verschillende tekens passen niet in een enkele byte! Daarom zijn er karakter-encodings uitgevonden. In de Westerse wereld is ISO-8859-1 de meest gebruikte (en ISO-8859-15, met €), terwijl in Oost-Europa ISO-8859-2 wordt gebruikt, in Thailand ISO-8859-11, enzovoort. Klein stukje van de tabel: (of zie: man iso-8859-1 en vrienden)
iso-8859-x
1 2 3 4 5 6 7 8 9 10 11 13 14 15 16
160 Non-breaking space (NBSP)
161 ¡ Ą Ħ Ą Ё     ¡ Ą ¡ Ą
162 ¢ ˘ ˘ ĸ Ђ   ¢ ¢ Ē ¢ ¢ ą
(... enzovoort ...)
255
Webpagina's, e-mails etc. kunnen aangeven welke karakterset ze gebruiken (charset=...), en programma's kunnen de de byte op de juiste wijze representeren. En iedereen kan rustig verder leven!

Nou ja, er zijn nog wat probleempjes; Chinees, Koreaans, Japan (CJK) talen hebben veel te veel tekens om in dit schema te passen. En wat te doen als je verschillende karaktersets wilt combineren? En liefst nog wat wiskundige symbolen, muzieknoten e.d. wilt gebruiken? De oplossing: Unicode. Unicode tracht alle karakters van de wereld te combineren, inclusief historische (spijkerschrift) en bedachte (Elfenrunen). Het vertalen van Unicode-karakters naar bytes kan op verschillende manieren. Win/Java gebruiken intern UTF-16, terwijl UNIX, www en e-mail meestal UTF-8 gebruiken (als ze überhaupt Unicode ondersteunen).

Bij het schrijven van programma's die met UTF-8 , en dan met name in C/C++, moet de programmeur extra zorgvuldig zijn. De aanname 1 karakter <=> 1 byte gaat niet meer op, en oeroude functies als strlen die daarvan uitgaan geven de verkeerde resultaten. Neem bevoorbeeld de € - in ISO-8859-15 is dat karakter 0xa4 (164), maar in UTF-8 is dat 0xe2,0x82,0xac - 3 bytes: euro's zijn duur! Ook zaken als toupper/tolower moeten heroverwogen worden (bijv. de uppercase versie van de Duitse "ß" is "SZ", van 1 naar 2 karakters). Karakters als àäá horen bij de Latin karakters in Unicode, en worden geëncodeerd met als eerste byte 0xc3, en da's "Ã" in iso-8859-1. Als er veel van die (ongewenste) Ãs in een tekst staan, is dat een indicatie dat er ergens een conversieprobleempje is.

Gelukkig zijn er libraryfuncties voor, zoals in glib voor C, en in boost:: en Glib::ustring voor C++. Voor Windows programmeurs (doorgaans UTF-16) gelden deels andere problemen, maar gelukkig heeft Microsoft een breed scala aan lelijke macro's om daarmee om te gaan :-) De aanname 1 karakter <=> 2 bytes is echter een valkuil.

Moraal van dit verhaal: een programma dat internationale tekst moet kunnen verwerken, moet met Unicode om kunnen gaan. Dat vergt wat extra werk van de programmeur, maar gelukkig zijn er libraries om de ergste pijn te verzachten. De ASCII-only wereld ligt achter ons, en er is geen weg terug...


0 Reacties:

Een reactie plaatsen


Emacs, the UberEditor Powered by Blogger