Speciale karakters in e-mail en usenet news
een fors artikel van de hand van Bob Brand

Iedereen die wel eens e-mail heeft geschreven of ontvangen en iedereen die wel eens usenet news volgt of actief deelneemt is het tegengekomen: Speciale karakters, accenten en recent het Euro-teken.
Of wat ook vaak gebeurt: een hoop rare tekens, codes of alleen vraagtekens of zelfs helemaal niets (weggevallen letters).

Karaktersets en coderingen
Even vooraf: het formaat van alle internet verkeer is vastgelegd in zogeheten RFC's: Request for Comments. Ze zijn allemaal te vinden op bijvoorbeeld http://www.rfc.net/.

Het formaat van e-mail lag tot voor kort vast in RFC 822, maar deze is recentelijk opgevolgd door RFC 2822. Allerlei moderniseringen die in de loop der jaren (RFC 822 spreekt nog van ARPA net in plaats van internet, dus gaat terug op de jaren '70 van de vorige eeuw) zijn toegevoegd in al dan niet experimentele staat zijn hiermee geformaliseerd. Maar één ding is gebleven: om transport van messages over allerlei hard- en software, nieuw en oud, goed te laten verlopen is de basis karakterset 7 bits (USASCII.
Alle speciale karakters, zoals karakters met accenten en het Euro-teken, zitten bij de diverse karaktersets in het gebied met waarden boven de 127. Dit worden vaak top-bit karakters genoemd omdat in de binaire representatie van dit soort karakters het ,bovenste' bit 1 is. Ingewikkeld? Vergeet dit dan maar direct.

Het is voor puur Engelse tekst geen enkel probleem om de hele boodschap in 7 bits ASCII te schrijven. Ook (Engelse) namen geven doorgaans geen problemen. Maar de rest van de wereld heeft niet genoeg aan alleen letters, cijfers en interpunctie. Er zijn immers ook letters met accenten, nu net nieuw het Euro-teken, speciale leestekens als het Spaanse omgekeerde vraagteken en omgekeerde uitroepteken, noem maar op. Om over Grieks, Russisch (Cyrillisch), Hebreeuws, Arabisch, Hindi, Japans, Chinees etc. nog maar te zwijgen. Daarom zijn er diverse coderingen ontwikkeld om al deze karakters te kunnen representeren. Met unicode (http://www.unicode.org/), een 16 bits codering, is het zelfs mogelijk om ze allemaal tegelijk door elkaar te gebruiken, maar het is nog niet zo ver dat alle computers met unicode werken. Sterker nog: zoals al opgemerkt zitten ,we' aan 7 bits ASCII vast voor mail en news.
Er zijn 8 bits karakter sets ontwikkeld met een doorsnee van de meest gebruikte tekens voor een bepaald taalgebied. Deze sets zijn door de ISO (International Standards Organization, http://www.iso.org/) gestandaardiseerd, al vindt men het bij Microsoft nodig om vroeger voor DOS en nu voor windows een eigen codering te gebruiken. Al overlapt de windows codering vrijwel geheel met de ISO coderingen.

RISC OS in de versie die de meeste Nederlanders (en Engelsen) gebruiken staat standaard op ISO 8859-1, ook bekend als ISO-Latin1. Dit is een karakterset met o.a. alle klinkers voorzien van de ons bekende accenten (aigu, grave, circonflex, trema/umlaut), de Spaanse n-tilde en Spaanse omgekeerde leestekens, enkele wiskundige tekens en enkele typografische tekens. Dit is voor Noord en een deel van Midden Europa. Andere sets zijn voor Zuid Europa, Griekenland (Griekse karakters), Oost Europa, delen van de Balkan (hacek op diverse letters en cedilles onder meer dan alleen de C), Rusland en andere delen van de Balkan (Cyrillisch), etc.

Speciale karakters in message body's
Om deze speciale tekens in een bericht (de message body) te gebruiken zijn er al lang geleden oplossingen bedacht.

De oudste is een pseudo-TEX1 notatie, ofwel een notatie die doet herinneren aan de zogeheten ,dode toetsen' op een schrijfmachine:
Je geeft eerst het accent en dan het teken waar het boven dient te komen. Bijvoorbeeld een e-aigu (é) wordt dan 'e, zoals in: L'eon. Iedereen die ooit met TEX of LATEX gewerkt heeft herkent dit, al gebruik je dan ook nog een backslash: L\'eon. Voor anderen is het even wennen, maar binnen de kortste keren lees je dit net zo makkelijk als tekst met de echte accenten. Het helpt overigens ook als de taal die je gebruikt er voorzieningen voor heeft. In het Duits kun je in plaats van een umlaut ook een e achter de betreffende letter zetten of ss (of was dat na de laatste Rechtschreibreform nu weer sz) voor een Ringel-S. Ook dat leest in eerste instantie wat verwarrend, maar je went er snel aan.
Nieuwer is MIME encodering. MIME staat voor Multi-purpose Internet Mail Extensions, vastgelegd in RFC 1341. Je geeft van te voren aan welke karakterset je gebruikt, of liever je mailer of newsreader doet dat voor je en het is dan aan de ontvanger om dit correct weer te geven. In het algemeen heb je onder RISC OS een font nodig voor de karakterset die je gebruikt, dus voor ISO 8859-2 (ISO-Latin2) heb je een ander font nodig, of een font met meerdere encoderingen, anders krijg je alsnog die karakters te zien die in Latin1 op dezelfde plek zitten. Mengen van karaktersets in een e-mail of news message kan dus -nog- niet onder RISC OS. (Er is een unicode fontmanager ontwikkeld, maar die is nog niet voor onze versie van RISC OS beschikbaar, nog even afgezien van het feit dat je dan ook unicode gecodeerde fonts nodig hebt.)
De meest gebruikte codering binnen MIME is Quoted-Printable. Dit houdt in dat alle top-bit karakters vervangen worden door een is-gelijk teken gevolgd door de hexadecimale waarde van het top-bit karakter. Voorbeeld Léon wordt L=E9on. De meeste mailers, newsreaders en browsers hebben hier geen moeite mee. Ook zijn ze vaak zo vriendelijk om de tekst die je wilt versturen op deze manier te coderen als je de betreffende optie aanzet, je hoeft hetdus niet met de hand te doen.
Met een oudere mailer, of zoals in het geval van AcoNet gekoppeld aan de IntAconet maillijst, met een Fido mailer (programma's als WimpLink, Binkley etc.) zie je dan deze codering wel eens verschijnen. Het voordeel is dat er, voor Nederlandse tekst, maar weinig karakters vervangen hoeven te worden door code zodat de message ook in oudere mailers nog redelijk leesbaar is. Voor talen met veel meer accenten, zoals Frans en Duits, is het echter behoorlijk irritant.

Speciale karakters in message headers
De ,headers', dat deel van de message dat o.a. aangeeft van wie het komt, waar het heen moet en zo, zijn voornamelijk bedoeld voor gebruik door computers en niet zo voor menselijk leesplezier. Die zijn dus slechts 7 bits om er zeker van te zijn dat ze alle soorten van hard- en software onderweg kunnen passeren. Het gebruik van 8 bits codes kan dus leiden tot interessante resultaten. In het beste geval komen deze codes er gewoon door, in het slechtste geval komt een bericht helemaal niet door of komt het heel ergens anders aan. En in het geval wat al meerdere keren op de IntAconet maillijst is gebeurd (en wat de aanleiding was tot dit artikel) is dat de top-bit karakters in de headers gewoon gestript worden en Léon heet dan ineens Lon.
Nu is men zich in de Internetwereld wel degelijk bewust van het feit dat er mensen zijn die hun naam in een taal schrijven waar accenten nodig zijn. Dus ook hier zijn extensies voor bedacht. Deze zijn wat minder gangbaar dan de manier van coderen van de message body. Maar het voordeel is dat het simpel met de hand te doen is als je een mailer gebruikt die het niet automatisch ondersteunt. Het gaat hier om een codering beschreven in RFC 1342 en het is gebaseerd op de al genoemde Quoted-Printable codering uit RFC 1341. De code ziet er als volgt uit:

=?<karakter set>?<codering>?<gecodeerde tekst>?=

<karakter set>
is de gebruikte karakter set, in ons geval dus vrijwel altijd ISO 8859-1 (ofwel ISO-Latin1).
<codering>
is de letter Q.
<gecodeerde tekst>
is de (doorgaans) naam met accenten die gecodeerd is op dezelfde manier als in Quoted-Printable, dus is-gelijk teken gevolgd door de hexadecimale code voor het betreffende top-bit karakter. Als extra geldt hier dat een underscore, _, altijd voor een spatie staat.

Onze al eerder aangehaalde Léon wordt dan:

=?iso-8859-1?q?L=e9on_Jansen?= <leon@zijn.adres>

of:

leon@zijn.adres (=?iso-8859-1?q?L=e9on_Jansen?=)

En dito voor bijvoorbeeld André de Vries:

=?iso-8859-1?q?Andr=e9_de_Vries?=

Als je mailer of newsreader een apart invulveld voor naam en adres heeft moet je dus alleen in het naam deel het gecodeerde stuk invullen. Als je mailer een configuratie optie heeft om top-bit karakters in headers op te nemen (zekere Windows mailers bijvoorbeeld) dan hoef je helemaal niets te doen, alleen die configuratie optie aan te zetten en je naam in te vullen met accenten waar je ze hebben wilt.
Mensen met een oudere mailer, of die messages of news via Fido lezen, krijgen dan dus een ,vreemde' afzender te zien vol met vraagtekens, Q's etc.

De codering is ongevoelig voor HOOFD of kleine letters. De te coderen naam is wel gevoelig. Dus:

=?ISO-8859-1?Q?L=e9on_Jansen?=

is precies hetzelfde als bovenstaande voorbeelden. Ook kortere delen coderen kan:

=?ISO-8859-1?Q?Andr=e9?= de Vries

is weer hetzelfde als het eerdere voorbeeld. Coderingen in woorden zijn echter niet gegarandeerd, meestal zal echter ook dat nog wel werken maar je moet niet gek opkijken van extra spaties. Dus iets als L-?ISO-8859-1?q?=e9?=on kan wel eens als: L é on te voorschijn komen.

Er is ook een B codering (dus =?ISO-8859-1?B?<te coderen tekst>?=) maar die wil je niet gebruiken voor tekst die ook nog voor mensen leesbaar moet zijn. Deze codering gebruikt namelijk base64 waardoor je een voor mensen onleesbare letterbrij krijgt. (Zie weer RFC 1341 voor de definitie van base64).

De Euro en andere munteenheden
Het zal niemand ontgaan zijn dat sinds 1 januari met Euro's betaald dient te worden. Het komt dus ook voor dat in e-mail en news berichten prijzen vermeld dienen te worden. En het ligt voor de hand om daar dan een Euro teken voor te gebruiken.
Maar helaas. De hierboven genoemde ISO coderingen zijn al opgesteld toen het Euro-teken nog niet bestond. Het is daarom toegevoegd aan een nieuwe codering: ISO 8859-15 ofwel ISO-Latin9. Hierin zit het Euro teken op plaats 164, op de plaats waar in Latin1 het internationale geldteken zit (een O met oortjes, op het Archimedes toetsenbord had dit teken zelfs een eigen toets). Maar mail gaat doorgaans in Latin1 en dat kent officieel geen Euro-teken.

Het Euro-teken is zowel in RISC OS 4 als in windows toegevoegd aan de meeste karaktersets. Bij beide systemen zitten er doorgaans twee Euro-tekens in een karakterset: een op plaats 128, dit is een Euro-teken aangepast aan het betreffende font en een op plaats 164, dit is het Euro-teken zoals door de EU vastgelegd. En officieel heeft Latin1 een gat op plaats 128. Onder RISC OS 2 werden die gaten gebruikt voor o.a. de sluit-, voor- en achtergrond iconen' van de windows.
Diverse artikelen in de pers over hoe een Euro-teken in te voeren in tekstverwerkers en mailers/newsreaders geven methodes om ofwel karakter 128 ofwel 164 in je tekst te krijgen. Binnen een tekstverwerker is dat geen probleem, zolang de printer het ook aan kan. Het wordt al een probleem als je die tekst naar iemand anders met een andere computer moet sturen. Maar het wordt pas echt een probleem als je dit in een e-mail probeert.
De meeste mailers zullen namelijk coderen in Latin1. Het Quoted-Printable mechanisme werkt op zich uitstekend, je krijgt netjes een =80 of =A4 in plaats van het Euro-teken. Maar de ontvangende mailer heeft dan een probleem. Er kunnen meerdere dingen gebeuren: mailers die op de hoogte zijn van de ,gaten' in ISO 8859-1 (Latin1) laten dan een vraagteken zien. Degenen die er niet van op de hoogte zijn maar die wel netjes doorgeven aan de fontmanager dat ze een Latin1 encoding verwachten laten dan ofwel zien wat er toevallig zit (een RISC OS desktop karakter, een w met circonflex (daar is geen HTML code voor) of (onder windows) een blokje. Als je geluk hebt krijg je zelfs een Euro-teken, maar daar moet je vooral niet op rekenen.

De aanbevolen methode is dan ook om voor muntsoorten niet de speciale tekens te gebruiken (bijvoorbeeld het Engels Pond teken zit ook niet in elke karakterset, noch het Japanse Yen teken) maar de officiële drie-letter afkorting die de banken ook gebruiken:

EURvoorEuro
GBPvoorEngels Pond
USDvoorUS Dollar
JPYvoorJapanse Yen
etc.

Voor ,oude' munteenheden zijn de afkortingen:

NLGvoorNederlandse Gulden
DEMvoorDuitse Mark
BEFvoorBelgische Frank
etc.

Dus je krijgt dan iets als: Een object kostte NLG 100 en kost nu EUR 45.

Een gerelateerd probleem is hoe het Euro-teken in een webpagina te krijgen. Wat veel mensen doen is de code &#128; of soms &#164; in de tekst zetten. Dat werkt echter alleen als het font dat de browser gebruikt op die plaatsen een Euro-teken heeft. Je kunt dus op die manier een heel ander effect krijgen.
De officiële code voor het Euro-teken in HTML is (verrassing):

&euro;

En in de unicode set is het karakter 0x20ac (of 8364 decimaal), dus ook &#x20ac; of &#8364; zou een Euro-teken moeten opleveren in de modernere browsers.
Om het even te testen op de browser waarmee je nu de Asterisk leest:

teken &#128;:
teken &#164;:¤
teken &x20ac;:
teken &euro;:

Ter vergelijking enige

waarmee ik het getest heb (onder RISC OS 3.7, dus zonder RISC OS's nieuwe fonts met Euro teken, en windows NT 4 sp6 met Euro-upgrade): (Browse, Fresco en Oregano (uiteraard) alleen voor RISC OS, Lynx zowel voor RISC OS als voor Windows en diverse smaken unix en Internet Explorer en Netscape alleen Windows.)

Dus ook hier: om zeker te zijn dat de bedoeling op een webpagina overkomt kun je beter de drie-letter afkorting EUR gebruiken. Dan &euro; en pas als laatste redmiddel &#128; of &#164;.

Tot slot:
Wil je zeker weten dat iedereen met wat voor software dan ook je bericht kan lezen, gebruik dan vooral geen coderingen maar de al eerder aangegeven pseudo-schrijfmachine of pseudo-TEX manier van schrijven.
Quoted-Printable voor de eigenlijke tekst van een bericht is meestal geen probleem. Maar ook hier geldt weer dat als je rekening wilt houden met oudere mailers dat je het dan beter niet kunt doen. Maar soms doet je mailer het voor je zonder dat je het weet.
Speciale karakters in de headers zijn ook mogelijk, maar bedenk of je niet uit de voeten kunt zonder deze, of met pseudo-schrijfmachine codes. Er zijn aanmerkelijk minder mailers die ook overweg kunnen met gecodeerde headers. Wil je het toch doen, gebruik dan de code zoals hierboven beschreven. Die kun je met de hand invoeren.

Nog iets? O ja, een mini progje om dit te automatiseren:


INPUT LINE N$
PRINT "=?ISO-8859-1?Q?";
@%="g2.0":REM 2 voor oudere BASICs
FOR I%=1 TO LENN$
  A%=ASCMID$(N$,I%)
  CASE TRUE OF
    WHEN A%<32,A%>=127:
      C$=STR$~A%
      IF LENC$<2 THEN C$="0"+C$
      PRINT "=";C$;
    WHEN A%=32: PRINT "_";
    OTHERWISE VDU A%
  ENDCASE
NEXT
PRINT "?="

En gebruik bijvoorbeeld Swipe en de Writable module of IcnClipBrd om het resultaat via het globale clipboard naar je mailer te verhuizen. (Zap en StrongED kunnen ook het globale clipboard gebruiken, dus als je Zap een taskwindow laat managen werkt dat deel zonder meer. Maar je hebt nog altijd Writable of IcnClipBrd nodig om het weer in het invulveld te plaatsen. Maar dat is een verhaal apart.)


1
Voor meer informatie over TEX en LATEX is de site van de Nederlandse TEX gebruikersgroep, http://www.ntg.nl/, een goed beginpunt. De RISC OS versie is momenteel alleen te vinden in de mirror van ,oude' FTP-sites op AcornSearch en op diverse CD's.