De belangrijkste vereisten voor meertalige tekstverwerkingssystemen zijn een (1) universeel mechanisme voor meerdere talen en (2) aanpasbaarheid en mogelijkheid tot uitbreiding van de faciliteiten van het systeem. In dit document worden de oplossingen voor deze vereisten beschreven verschaft door het systeem genaamd Mule (MULtilingual Enhancement to GNU Emacs). Mule is een plain-text (niet gecodeerde tekst) screen-editor die onder diverse besturingssystemen werkt (UNIX, DOS, Windows en OS/2 op meerdere platforms). Het Mule-systeem verschaft de gebruiker een flexibele meertalige tekstverwerkingsomgeving die naast eenvoudige tekstverwerking tevens lezen/schrijven van Internet-mail en nieuws, browsen van Web-pages, etc. biedt.
Door de opmerkelijke vooruitgang in de computer-technologie is er nu voldoende computer-vermogen beschikbaar om niet alleen Engels maar tevens talloze andere talen elektronisch te verwerken. In veel landen zijn speciale methoden ontwikkeld voor verwerking van de plaatselijke taal. Deze methoden zijn gebaseerd op de eigenschappen van de betreffende taal en leveren doorgaans geen problemen op, mits de computer-omgeving beperkt blijft tot die taal. De groeiende opmars van Internet, waarbij communicatie plaatsvindt via meerdere locaties/landen/talen, heeft echter de behoefte opgeroepen aan een systeem voor gelijktijdige verwerking van meerdere talen; ieder lokaal systeem is namelijk onafhankelijk ontworpen en niet afgestemd op de andere lokale systemen.
Mule, een meertalige plain-text editor gebaseerd op GNU Emacs, is ontwikkeld als instrument voor de verwerking van meerdere talen. GNU Emacs is een van de meest bekende en gebruikte editors in de UNIX wereld. De belangrijkste eigenschap van Emacs is de voorziening van de Emacs Lisp interpreter en de meeste faciliteiten worden gerealiseerd in Emacs Lisp, wat betekent dat de GNU Emacs aangepast kan worden door enkel wijzigen of toevoegen van Emacs Lisp programma's. Emacs kan gebruikt worden voor editing, maar tevens voor praktisch alle andere tekstverwerkings-doeleinden zoals lezen/schrijven van Internet-mail en nieuws, browsen van de Web pages, naslag in referentie-documenten, raadplegen van on-line woordenboeken, etc. Al deze functies zijn voorhanden via Emacs Lisp programma's en kunnen dus volledig aan de wensen van de gebruiker worden aangepast.
Mule kan de hiervoor beschreven faciliteiten inzetten in de meertalige omgeving. Mule gebruikers kunnen bijvoorbeeld mails uitwisselen en Web-pages lezen in iedere willekeurige taal, mits de taal verenigbaar is met Mule.
Bij het ontwerpen van Mule hebben wij ernaar gestreefd een systeem te ontwikkelen dat aan de volgende twee voorwaarden voldoet:
De belangrijkste voorwaarde voor meertalige tekstverwerking is een universeel instrument dat meerdere talen kan verwerken zonder dat hierbij de functies verloren gaan die op lokaal niveau voor iedere taal zijn ontwikkeld. De tekstverwerkingsprogramma's die voor de diverse talen zijn ontwikkeld, verschillen in vele opzichten. Bijvoorbeeld: welke karaktergroep wordt gebruikt, hoe wordt de tekst op het beeldscherm weergegeven, hoe wordt de tekst vanaf het toetsenbord ingevoerd, welke codeermechanismen worden in de bestanden gebruikt. Een systeem dat voor meerdere talen bestemd is, moet een universeel instrument bevatten dat al deze variaties kan verwerken.
Als tweede zijn de aanpasbaarheid van het systeem en de mogelijkheid tot uitbreiding van groot belang. Met andere woorden, kan het systeem op eenvoudige wijze aan specifieke eisen worden aangepast en kunnen er extra functies aan worden toegevoegd. Het is namelijk onmogelijk om een systeem te ontwerpen dat vooraf reeds alle functies bevat voor alle compatibele talen. Het aantal compatibele talen kan bijvoorbeeld veranderen. In sommigen landen is het zelfs mogelijk dat de standaard omgeving voor de nationale taal gewijzigd wordt. Een systeem dat niet de flexibiliteit bezit om wijzigingen of extra functies op te nemen, zal spoedig zijn bruikbaarheid verliezen, of het systeem is niet meer geschikt voor het toevoegen van nieuwe talen.
Wanneer dus een functie gevonden wordt die vereist is voor sommige talen, wordt deze functie niet meteen aan het systeem toegevoegd. We bepalen eerst of de betreffende functie ook nodig is voor andere talen, of dat eventueel een gedeelte van de functie ingebouwd moet worden voor alle talen en een ander gedeelte van de functie variabel is en al naargelang de omstandigheden kan worden gewijzigd. Nadat omtrent deze punten een beslissing is genomen, wordt de meest bruikbare functie ontwikkeld.
Tekstverwerking is een complex proces. De meest elementaire stappen bestaan uit het invoeren, opslaan, oproepen en weergeven van de tekst. Wanneer we zeggen dat Mule een bepaalde taal ondersteunt, bedoelen we dat Mule op zijn minst het volgende kan doen met de taal:
Met "standaard" bedoelen we niet alleen "officile standaard" maar tevens "de facto standaard". Bovendien worden bij de verwerking van de tekst de letters (karakters), woorden en zinnen behandeld overeenkomstig de standaard schrijfregels voor die taal. Al deze voorzieningen worden gestuurd door een universeel mechanisme voor het behandelen van karaktersets, codeersystemen, invoermethoden en weergave-routines.
Inhoudsopgave voor de hiernavolgende hoofdstukken:
Onder een karakterset wordt een groep karakters verstaan die gebruikt wordt voor een bepaalde regionale tekst (bijv. een Engelse tekst, Japanse tekst). Het gebruik van n enkele karakterset geschikt voor alle talen zou de ideale oplossing zijn voor de programmatuur-ontwikkelaar, maar deze oplossing is er op het ogenblik nog niet. ISO 10646 (of Unicode) kan niet gebruikt worden, in het bijzonder voor Chinese karakters, vanwege de inconsistente behandeling van de CJK-unificatie. Dit is de reden waarom wij besloten hebben om in Mule met meerdere karaktersets te werken.
De meeste karaktersets die in Mule worden gebruikt, corresponderen op een n-tot-n basis met de karaktersets die geregistreerd zijn in ISO (ISO 8859-1, JIS X0208). Alhoewel iedere ISO karakterset herkenbaar is aan het formaat-type (d.w.z. het aantal karakters in de set) en het eind-karakter (de 1-bite code waardoor de karakterset wordt onderscheiden van karaktersets van hetzelfde formaat), wordt door Mule een uniek identificatienummer gebruikt, genaamd charset-id, voor herkenning van de karaktersets. Om dus in Mule een karakterset te definiren, wordt een unieke charset-id aan de corresponderende ISO karakterset toegewezen en aan Mule wordt de informatie verschaft betreffende de diverse parameters van de karakterset. Deze parameters, die gebruikt worden voor editing-toepassingen, bevatten informatie betreffende de breedte van de tekstweergave, de schrijfrichting, etc. Tabel 1 toont voorbeelden van karaktersets.
| ISO karakterset | parameters gebruikt in Mule | ||||||
| naam | formaat-type | eind-karakter | charset-id | bytes | breedte | richting | |
| ASCII | 94 | 'B' | 0 | 1 | 1 | left-to-right | |
| ISO8859-1 | (Latin1) | 96 | 'A' | 129 | 2 | 1 | left-to-right |
| ISO8859-8 | (Hebrew) | 96 | 'H' | 136 | 2 | 1 | right-to-left |
| TIS620 | 96 | 'T' | 133 | 2 | 1 | left-to-right | |
| GB2312 | 94 X 94 | 'A' | 145 | 3 | 1 | left-to-right | |
| JISX0208 | 94 X 94 | 'B' | 146 | 3 | 1 | left-to-right | |
| CNS11643-1 | 94 X 94 | 'G' | 149 | 4 | 1 | left-to-right | |
| CNS11643-3 | 94 X 94 | 'I' | 246 | 4 | 1 | left-to-right | |
Het is tevens mogelijk om een karakterset te definiren die niet geregistreerd is in ISO. In dat geval gebruikt Mule een eind-karakter dat door ISO gereserveerd is voor persoonlijk gebruik. Indien de karakterset oorspronkelijk niet voldoet aan de technische vereiste ISO 2022, dient de set in kleinere sets te worden opgedeeld of de karaktercode-punten moeten gewijzigd worden zodat aan de technische vereist is voldaan. Een typisch voorbeeld is de Vietnamse karakterset, waarvan de bijzonderheden verderop in de tekst worden beschreven.
De meest gebruikelijke en eenvoudigste manier om een tekst in het geheugen van de computer te bewaren, is de weergave van ieder karakter door een aantal elementen van vastgestelde lengte (een tot vier bytes). Bij een meertalige tekst zijn n of twee bytes voor de aanduiding van de karakters natuurlijk niet voldoende om alle eventueel mogelijke karakters aan te geven. Het gebruik van vier-bytes elementen zou wel voldoende zijn voor alle bestaande karakters, maar dat is een grote verspilling van geheugen bij een tekst waarin uitsluitend Engels gebruikt wordt. Dit is de reden waarom wij in plaats van een aanduiding via een vastgesteld aantal elementen gekozen hebben voor een multi-byte variabele lengte (wordt hierna de "multi-byte vorm" genoemd) voor weergave van de karakters in Mule's buffer. De voordelen zijn een efficint gebruik van het geheugen en de mogelijkheid tot uitbreiding van de faciliteiten en functies. (Het idee werd ontwikkeld door Richard Stallman.)
Bij de multi-byte vorm wordt ieder karakter voorgesteld door n of twee bytes voor de hoofdcode van de charset-id en de volgende n of twee bytes zijn voor het karakter zelf. De enige uitzondering zijn de ASCII karakters, die op de normale wijze worden voorgesteld, en de charset-id is 0. Tabel 2 toont de formele definitie van de interne karakter-voorstelling van Mule.
CHARACTER := ASCII_CHAR | MULTIBYTE_CHAR
MULTIBYTE_CHAR := PRIMARY_CHAR_1 | PRIMARY_CHAR_2
| SECONDARY_CHAR_1 | SECONDARY_CHAR_2
PRIMARY_CHAR_1 := LEADING_CODE_PRI C1
PRIMARY_CHAR_2 := LEADING_CODE_PRI C1 C2
SECONDARY_CHAR_1 := LEADING_CODE_SEC LEADING_CODE_EXT C1
SECONDARY_CHAR_2 := LEADING_CODE_SEC LEADING_CODE_EXT C1 C2
ASCII_CHAR := 0 | 1 | ... | 127
LEADING_CODE_PRI := 129 | 130 | ... | 153
LEADING_CODE_SEC := 154 | 155 | 156 | 157
C1, C2, LEADING_CODE_EXT := 160 | 161 | ... | 255
In de tabel verschillen PRIMARY_CHAR en SECONDARY_CHAR enkel in de vereiste hoeveelheid geheugen per karakter; bij editen is er geen verschil tussen beide. De charset-id wordt voorgesteld door een enkele LEADING_CODE_PRI (bij een charset-id van 129 t/m 154) of een combinatie van LEADING_CODE_SEC en LEADING_CODE_EXT (bij een charset-id van meer dan 160). Een n-byte karakterset kan maximaal 96 karakters bevatten en wordt voorgesteld door een twee of drie bytes reeks; een twee-byte karakterset kan maximaal 9216 (96 x 96) karakters bevatten en wordt voorgesteld door een drie of vier bytes reeks. De vaak gebruikte karaktersets zijn door ons uitgekozen en als PRIMARY gedefinieerd. Alle door de gebruikers toegevoegde karaktersets zijn als SECONDARY gedefineerd. In de Chinese (Taiwanese) karakterset serie CNS11643 zijn de eerste twee plains PRIMARY maar de resterende plains zijn SECONDARY (zie Tabel 1). Figuur 1 toont het gebruik van het n-byte code-gebied.
| 0x00--0x7f | character code of ASCII_CHAR |
| 0x80--0x99 | LEADING_CODE_PRI |
| 0x9a--0x9f | LEADING_CODE_SEC |
| 0xa0--0xff | 1st and 2nd charactercodes of MULTIBYTE_CHAR or LEADING_CODE_EXT |
Met een codeersysteem, of codeermechanisme, wordt een methode voor het coderen van tekst bedoeld. Op de computer worden vele codeersystemen gebruikt die bovendien per land kunnen verschillen. Mule verzorgt automatische code-omzetting vanaf de diverse tekstvoorstellings-formaten naar de interne multi-byte vorm wanneer Mule communiceert met de externe omgeving via lezen/schrijven van bestanden of via andere processen, bij communicatie via netwerken, of bij ontvangst van gegevens vanaf een termnimal of uitvoeren van gegevens naar een terminal.
Om de code-omzetting flexibel te houden, dit wil zeggen met behoud van de mogelijkheid tot aanpassing en uitbreiding, is Mule niet van een vaste omzettingsroutine voorzien. In plaats hiervan is een generisch codeersysteem ontworpen met diverse in te vullen parameters. De meeste tegenwoordig in gebruik zijnde codeersystemen passen in het ISO 2022 kader. We hebben het codeersysteem daarom opgedeeld in een ISO-2022 type en een niet ISO-2022 type. Voor het eerste type is de generische ISO 2022 interpreter ontworpen en voor het andere type werd een eenvoudige programmeertaal ontwikkeld, CCL (Code Conversion Language) genaamd, en een interpreter voor de CCL.
Wanneer de gebruiker een codeersysteem specificeert voor een bepaalde taak (bijv. lezen van een bestand of sturen van mail) activeert Mule automatisch de ISO 2022 interpreter of de CCL interpreter overeenkomstig het gespecificeerde codeersysteem.
Alhoewel de ISO 2022 vele variaties toestaat voor het coderen van een bepaalde tekst, worden in feite slechts enkele van deze variaties gebruikt. Dit betekent dat voor het specificeren van een bepaalde codering een klein aantal parameters voldoet zoals aangegeven in Tabel 3. Bijvoorbeeld, de Chinese, Japanse en Koreaanse varianten van EUC (Extended UNIX Code) en alle ISO-8859 series (onderdeel nr. 1 t/m 10) verschillen enkel in de initile parameter-toewijzingen en de gereserveerde toewijzingen. Andere voorbeelden zijn de 7-bit ISO-2022 serie zoals de ISO-2022-JP, ISO-2022-JP-2, ISO-2022-KR en ISO-2022-CN. Deze maken alle gebruik van de 7-bit omgeving en verschillen enkel in de gereserveerde toewijzingen en de vergrendelde shift-functie. De eerste twee hebben geen vergrendelde shift-functie en de laatste twee wel.
| parameter | waarde | betekenis |
| initile toewijzing | charset-id lijst | Voor ieder grafisch register, de karakterset waaraan deze oorspronkelijk is toegewezen. |
| gereserveerde toewijzingen | charset-id lijst | Voor ieder grafisch register, de karakterset waaraan deze bij de codering is toegewezen. |
| 7-bit omgeving | waar/onwaar | Gebruik enkel de onderste 7-bit of gebruik de volledige 8-bit bij de codering. |
| vergrendelde shift-functie | waar/onwaar | Gebruik de vergrendelde shift-functie wel of niet. |
| enkelvoudige shift-functie | waar/onwaar | Gebruik de enkelvoudige shift-functie wel of niet. |
| richting-aanduiding | waar/onwaar | Gebruik een escape-routine van ISO-6429 voor het aangeven van de schrijfrichting bij de codering. |
Tabel 4 toont hoe eenvoudig het is om een ISO-2022 type codeersysteem in Mule te definiren. Nadat het codeersysteem gedefinieerd is, kan dit gespecifieerd worden voor iedere willekeurige situatie waarin code-omzetting vereist is. Bijvoorbeeld, na het definiren van tabel 4, kan de gebruiker GB bestanden lezen/schrijven en Chinese karakters weergeven op een GB terminal, en mails uitwisselen in GB.
'*euc-china* ;; Naam van codeersysteem
2 ;; Type, '2' betekent ISO-2022 type
?C ;; Mnemonisch karakter van codeersysteem
t ;; auto-detectie en einde-van-regel type (CR, CRLF, LF)
(lict lc-ascii lc-cn ;; G0 is voor ASCII, G1 is voor Chinese GB2312
nil nil ;; G2 en G3 worden niet gebruikt.
Voorbeelden van een non-ISO-2022 codeersysteem zijn het Russische KOI-8 en Vietnamese VISCII systeem. Alhoewel KOI-8 voldoet aan de technische vereiste ISO 2022, zijn de code-punten van de karakters verschillend van ISO 8859-5 (Latijn/Cyrillisch alfabet) welke de systeemgekozen karakterset is voor de Cyrillische karakters in Mule.
VISCII gebruikt volledige 8-bit codes voor de 134 specifieke Vietnamese karakters die niet voldoen aan de technische vereiste ISO 2022. Vandaar dat in Mule de Vietnamese karakterset verdeeld is in twee delen, de kleine letters en de hoofdletters, en aan elke set is een eigen charset-id toegewezen.
Aangezien de generische ISO 2022 interpreter niet gebruikt kan worden voor het decoderen en coderen van deze karaktersets, is Mule voorzien van CCL programma's voor het uitvoeren van de vereiste omzetting. CCL is een eenvoudige maar veelzijdige programmeertaal voor het schrijven van de code-omzettingslogaritme. Dit betekent dat Mule theoretisch ieder codeersysteem kan verwerken met een geschikt CCL programma. Tabel 5 toont de bron van het CCL programma voor de codering van KOI-8.
(define-ccl-program ccl-write-koi8
'(1
((read r0)
(loop (if (r0 != 140) (write-read-repeat r0)
((read r0) (r0 -= 160)
(write-read-repeat r0
[ 32 179 32 32 32 32 32 32 32 32 32 32 32 32 32 32
225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
32 163 32 32 32 32 32 32 32 32 32 32 32 32 32 32])
)))))
"CCL program to write KOI8.")
Bij nadere beschouwing kunnen de bestaande invoermethoden voor meertalige karakters in de volgende vier typen worden onderverdeeld.
Bijvoorbeeld, bij de Japanse invoermethode worden eerst de Hiragana tekens (Japans klankschrift) getypt en daarna wordt deze invoer door middel van een conversie-programma omgezet in de juiste combinatie van Kanji (Chinese karakters) en Hiragana tekens. Er bestaan diverse conversie-programma's zoals Wnn, Canna en SJ3 (dit zijn programma's voor het Japans) en CWnn (voor het Chinees) die vanuit Mule gebruikt kunnen worden. Deze programma's bevatten een grote hoeveelheid informatie omtrent het vocabulaire en de grammatica van de betreffende taal om het juiste karakter te kunnen genereren.
In Mule worden de invoermethoden van de eerste drie typen verzorgd via een toetsenbord-invoer vertaalsysteem genaamd Quail. Quail ontvangt steeds n set vertaalregels (genaamd "Quail package") en vertaalt op basis hiervan de door de gebruiker ingevoerde gegevens. Iedere vertaalregel bestaat uit een toetsen-reeks en de bijbehorende vertaalde tekst. Een bepaalde vertaalregel kan meerdere alternatieven voor de vertaalde tekst opleveren. In dat geval wordt de gebruiker gevraagd een keuze te maken uit de mogelijkheden.
Een Quail package kan gemakkelijk aan de wensen van de gebruiker worden aangepast. De gebruiker kan nieuwe vertaalregels toevoegen of bestaande vertaalregels wijzigen. Aangezien de Quail package modulair is opgebouwd, is ook het toevoegen van nieuwe regels voor een nieuwe taal eenvoudig. Dit gebeurt door het maken van een nieuw package met een geschikte naam en het definiren van de vertaalregels die bij het package horen. Tabel 6 toont het maken van een nieuw Quail package voor een gesimuleerde Caps-Lock functie (d.w.z. alle kleine letters worden automatisch in hoofdletters vertaald).
;; Definieer eerst een nieuw Quail package.
(quail-define-package "caps-lock"
"Caps-Lock" nil "Simulate Caps-Lock")
;; Definieer vervolgens de vertaalregels voor het package.
(quail-defrule "a" "A")
...
De invoermethoden van het laatste type worden verwezenlijkt via een systeem genaamd Tamago. Dit systeem vertaalt eerst de invoer van het toetsenbord in bepaalde fonetische codes (Hiragana in het Japans en PinYin of ZhuYin in het Chinees) en stuurt deze vervolgens via een netwerk naar een extern conversie-programma. Indien gewenst, kan in het begin het Quail-systeem worden gebruikt. Tamago is echter een programma dat afzonderlijk van Quail is ontwikkeld en heeft een eigen systeem voor het genereren van de fonetische codes. Aangezien de conversies niet volledig geautomatiseerd kunnen worden, kiest de gebruiker indien vereist handmatig het gewenste alternatief. Op het moment kan Tamago de Wnn en cWnn als conversie-server gebruiken.
Tekstverwerking is niet enkel het invoeren van karakters. Mule verschaft diverse instrumenten die van pas komen bij het tekstverwerkingsproces. Als voorbeelden kunnen de karakter-categorien en de veelzijdige expressie-compiler worden genoemd. Deze laatste biedt een snelle expressie-zoekfunctie.
Bij het editen (bewerken) van tekst is het vaak gewenst om meerdere karakters in een groep onder te brengen en de groep te gebruiken in editing-commando's. Een gebruiker wilt bijvoorbeeld willekeurige Cyrillische karakters zoeken, maar wenst niet alle Cyrillische karakters te specificeren en deze te combineren met OR operators. Om in deze mogelijkheid te voorzien, wijst de oorspronkelijke GNU Emacs een karakter-syntaxiscode aan ieder karakter toe. De karakter-syntaxis heeft echter zijn beperkingen. Ieder karakter kan maximaal n karakter-syntaxis hebben en de gebruikers kunnen geen nieuwe syntaxis definiren.
Mule biedt nog een tweede manier om karakters te groeperen en wel via karakter-categorien. In dit geval definieert de gebruiker bepaalde karakter-categorien en wijst dan n of meerdere categorien aan een bepaald karakter toe. Tabel 7 toont de standaard (default) karakter-categorien van Mule. Bij editen worden de woorden vaak n voor n verwerkt, maar afhankelijk van de taal kan het begrip 'woord' een verschillende inhoud hebben. Met Mule kan de gebruiker een woord definiren op basis van deze karakter-categorien, waardoor de editing-commando's naar wens kunnen worden aangepast.
| 'b' | Arabische karakters |
| 'c' | 2-byte Chinese karakters |
| 'g' | Griekse karakters |
| 'h' | 2-byte Koreaanse karakters |
| 'j' | 2-byte Japanse karakters |
| 'k' | 1-byte Japanse Katakana-karakters |
| 'r' | 1-byte Japanse Romeinkarakters |
| 'l' | Latijnse karakters |
| 'w' | Hebreeuwse karakters |
| 'y' | Cyrillische karakters |
| Taiwanese karakters |
De tekstweergave op het beeldscherm kan in twee gevallen worden onderverdeeld: Mule wordt gebruikt op een bepaalde terminal (of een terminal-emulator zoals "xterm", "kterm", "cxterm", etc.) of Mule draait onder een window-systeem.
In het eerste geval stuurt Mule alleen de juist gecodeerde tekst naar de terminals en laat de omzetting naar meertalige tekst over aan de terminals. De code-conversie geschiedt overeenkomstig het codeersysteem dat is gespecifieerd voor de terminal-uitgang. Bijvoorbeeld, wanneer een gebruiker Mule draait vanaf "cxterm", kan er enkel Engels en Chinees op het scherm worden weergegeven.
Wanneer Mule onder een window-systeem draait, is Mule verantwoordelijk voor de weergave van de meertalige tekst. In Mule is aan iedere karakterset een bijbehorend font toegewezen. Een verzameling mappings van alle karaktersets en de bijbehorende fonts wordt een fontset genoemd en dit is de basis voor de weergave van de karakters. Mule kan afhankelijk van de context een verschillende fontset gebruiken. Bij het lezen van mail kan een subject-veld bijvoorbeeld vetgedrukt worden weergegeven. In dit geval wordt het fontset van de verzameling vetgedrukte fonts alleen gebruikt voor het subject-veld.
Bij X window komen Mule's interne karaktercodes gewoonlijk overeen met de code-punten van het bijbehorende font. De Japanse karakterset JISX0208 kan bijvoorbeeld juist worden weergegeven door een font waarin de karaktercode-punten voldoen aan JISX0208. Maar ook als deze matching niet geldt voor een bepaalde combinatie van karakterset en font kunnen de interne code-punten toch via een CCL programma (zie beschrijving in het vorige hoofdstuk) worden omgezet naar die van een bepaald font. Mule's karakterset voor Cyrillische karakters is bijvoorbeeld gebaseerd op ISO 8859-5, terwijl de gebruiker misschien alleen een KOI-8 font heeft. In een dergelijk geval hoeft de gebruiker enkel de mapping van de fontset te wijzigen zodat het KOI-8 font gebruikt wordt voor de Cyrillische karakterset, en een geschikt CCL programma aan de Cyrillische karakterset te verbinden (zie Tabel 8).
Wanneer de gebruiker het systeem geschikt wilt maken voor een nieuwe taal, hoeft hij enkel een mapping aan de nieuwe karakterset toe te voegen en een geschikt font aan de bestaande fontsets.
;; Wijzig font-mapping in de fontset DEFAULT-FONTSET.
(set-fontset-font default-fontset lc-crl "HERE_COMES_KOI8_FONT_NAME")
(define-ccl-program ccl-x-koi8
'(0
((r1 -= 160)
(r1 = r1
[ 32 179 32 32 32 32 32 32 32 32 32 32 32 32 32 32
225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
32 163 32 32 32 32 32 32 32 32 32 32 32 32 32 32])))
"CCL program to convert chars of lc-crl (ISO8859-5) to KOI8 font.")
;; Verbind het CCL programma met de Cyrillische karakterset LC-CRL.
(x-set-ccl lc-crl ccl-x-koi8)
In de voorgaande hoofdstukken is de meertalige tekst-editor Mule beschreven, waarbij in het bijzonder de aanpasbaarheid en uitbreidingsmogelijkheden van het systeem zijn aangeduid. Mule is uitgerust met de Emacs Lisp interpreter zodat een open systeem is verkregen. Het systeem kan met behulp van eenvoudige Emacs Lisp programma's aan de wensen van de gebruiker worden aangepast.
Mule werd in 1993 uitgebracht. Sindsdien zijn door vele personen bijdragen geleverd voor hun eigen taal. Het systeem is nu geschikt voor de meeste Europese talen (met inbegrip van Russisch en Grieks) en Oost-Aziatische talen (Chinees, Japans, Koreaans), en ook voor het Thais, Vietnamees, Hebreeuws, Arabisch, Turks en nog diverse andere talen. Er wordt op het ogenblik aan gewerkt om het systeem geschikt te maken voor de Indiase talen (Devanagali schrift).
Behalve nieuwe talen, komen er ook steeds meer applicaties bij die onder Mule draaien, zoals on-line woordenboeken, MIME codeerder en decodeerder. Mule kan dus beschouwd worden als een meertalige workbench/omgeving en niet enkel een editor.
Op het moment wordt in samenwerking met de Free Software Foundation gewerkt aan de integratie van Mule in de oorspronkelijke GNU Emacs. De Free Software Foundation is de organisatie die de distributie van GNU Emacs verzorgt. De toekomstige versies van GNU Emacs zullen voorzien zijn van Mule's meertalige faciliteiten.
Mule wordt gratis gedistribueerd onder de voorwaarden van GNU GENERAL PUBLIC LICENSE. De Mule versie 2.3 is verkrijgbaar via anonieme ftp op de volgende sites en bijbehorende mirroring sites.