De viktigaste uppgifterna för mångspråkig textbehandling är (1) ett enhetligt system för många språk och, (2) med reglerings- och utbyggbarhet av systemfaciliteter. Nedan förklaras kort hur Mule (MULtilingual Enhancement to GNU Emacs) löst dessa. Mule är ett bildskärmssystem för textredigering som kan användas med många olika system (UNIX, DOS, Windows och OS/2 på många plattformar). Mule erbjuder en flexibel mångspråkig textbehandlingsmiljö som täcker inte bara enkel textredigering men också läsa/skriva Internet elektronisk post och nyhetsgrupper, bläddra/läsa Web sidor, etc. Allt detta styrs av ett enhetligt system och kan regleras och byggas ut för individuella behov.
Med datorteknologins enastående framsteg har vi nu tillräcklig dator- kapacitet för hantera inte bara engelska men också många andra språk. Många länder har redan utvecklat egna metoder för hantera nationella språk på datorer. De flesta är baserade på lokala system som inte ger problem så länge som datormiljön är begränsad till landet ifråga. Men nu när Internet knutit hela världen närmare samman har behovet ökat för obehindrad kommunikation mellan olika platser/nationer/språk och vi står inför svårigheten att hantera många språk tillsammans pga att varje lokalt system utvecklats oberoende av alla andra.
För lösa problemet att hantera många språk har vi utvecklat Mule, ett mångspråkigt textredigeringssystem baserat på GNU Emacs. GNU Emacs är ett av de mest välkända och använda redigeringssystemen i UNIX. Emacs mest utmärkande egenskap är Emacs Lisp interpretator, som utför de flesta faciliteterna med Emacs Lisp, som gör det möjligt att bygga ut GNU Emacs genom bara modifiera eller utöka Emacs Lisp program. Emacs kan användas inte bara för textredigering men också för alla slags textbehandling inklusive läsa/skriva Internet elektronisk post och nyhetsgrupper, bläddra/läsa Web sidor, bruksanvisningar, referera till on-line ordböcker, etc. Allt detta görs med Emacs Lisp program som sålunda kan skräddarsys för olika individuella behov.
Mule omfattar alla dessa faciliteter för användning i mångspråkig miljö. Mule användare kan t. ex. skicka/motta post och läsa Web sidor på alla språk som har Mule support.
Vi har utvecklat Mule med följande två huvudpunkter i minnet:
Den svåraste och viktigaste uppgiften i mångspråkig textbehandling är ett enhetligt system som kan hantera många språk utan att förlora bekvämligheten av lokalisering för varje språk. Textbehandling på olika språk skiljer sig i många avseenden: vilken teckenuppsättning som används, hur texten visas på bildskärmen, hur texten matas in från tangentbordet, vilken kodning som används i dokumenten. Mång- språkighet kräver ett enhetligt system som täcker dessa variationer.
Andra viktiga uppgifter är reglerbarhet och utbyggbarhet, dvs. hur man enkelt skräddarsyr eller bygger ut faciliteter. Det är nästan omöjligt att på förhand utforma alla nödvändiga funktioner för alla språk. Antalet språk som har support kan ändras i framtiden. I utvecklings- länder kan även normalstandarden för nationella språk ändras. Varje system utan flexibilitet att modifiera eller bygga ut dess faciliteter blir snart oanvändbart eller alltför krångligt för utöka med nya språk.
Därför, även om vi ser behovet för en ny nödvänding funktion för vissa språk, utökar vi inte omedelbart denna. Vi undersöker först om andra språk också behöver liknande funktion, vilken del av funktionen som bör göras gemensam för alla språk och vilken del av funktionen som bör göras modifierbar. När allt detta klargjorts utformar vi den mest mångsidiga funktionen.
Textbehandling är komplicerat arbete. Det innebär textinmatning, minnesprogramering, återställning och bildskärmsvisning. Mule support för vissa språk innebär följande:
Följande avsnitt är organiserade som följer:
En teckenuppsättning är en teckengrupp som används tillsammans för vissa språktexter (dvs. engelsk text, japansk text). Även om en enda teckenuppsättning är önskedrömmen för alla systemprogramerare existerar denna inte än så länge. ISO 10646 (eller Unicode) är inte användbar i nuläget speciellt för kinesiska tecken pga. dess inkonse-kventa hantering av CJK enhetlighet. Vi beslöt därför hantera många teckenuppsättningar i Mule.
De flesta teckenuppsättningar i Mule motsvarar var för sig teckenupp- sättningar registrerade i ISO (t.ex. ISO 8859-1, JIS X0208). Fastän varje ISO teckenuppsättning identifieras av dess storlek-typ (antalet tecken) och sista tecknet, (en byte kod för särskilja teckenuppsättningar av samma storlek-typ), identifierar Mule varje teckenuppsättning med ett unikt ID-nummer kallat charset-id. För definiera viss teckenupp- sättning i Mule måste ett unikt charset-id tilldelas som motsvarar ISOs teckenuppsättning för informera Mule om flera parametrar för tecken- uppsättningen. Dessa parametrar används för textredigering, visnings- bredd och skrivriktning, etc. Tabell 1 visar exempel på teckenupp- sättningar.
| ISO teckenuppsättning | Mule parametrar | ||||||
| namn | storlek-typ | sista tecken | charset-id | bytes | bredd | riktning | |
| 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 | |
Det är också möjligt att definiera en teckenuppsättning som inte är registerad i ISO. I detta fall använder Mule ett sista-tecken reserverat för privat bruk av ISO. Om en teckenuppsättning inte ursprungligen uppfyller de tekniska kraven för ISO 2022, bör denna delas upp i små teckenuppsättningar eller dess teckenkodpunkter ändras för uppfylla de tekniska kraven. Ett typiskt exempel är vietnamesisk teckenuppsättning, som beskrivs mera detaljerat i nästa avsnitt.
Det vanligaste och enklaste sättet att bevara text i datorminnet är att representera varje tecken med ett antal fixerade längdelement (en till fyra byte). För mångspråkig text är emellertid en eller två byte för varje tecken inte tillräckligt för täcka alla tecken i världen. Fyra byte-element är kanske tillräckliga, men slösar minneskapacitet för endast engelsk text. Istället för fixerad längd representation använder vi ett variabelt multi- byte format (kallas multi-byte format härefter) att representera tecken i Mules buffert för effektiv minnesanvändning och utbyggbarhet. (Idén kommer från Stallmans korta anmärkning.)
Med multi-byte format representeras varje tecken av en eller två byte av huvudkoderna för charset-id och följande en eller två byte för tecken- koden. Enda undantaget är ASCII tecken som representeras som dom är och charset-id 0. Tabell 2 visar formell definition av interna teckenrepresentationen i 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
I tabellen skiljer sig PRIMARY_CHAR och SECONDARY_CHAR endast genom minneskrav per tecken. Vid redigering finns ingen skillnad. Charset-id representeras av en enda LEADING_CODE_PRI (i detta fall är charset-id från 129 till 154) eller en sekvens av LEADING_CODE_SEC och LEADING_CODE_EXT (i detta fall är charset-id mer än 160). En byte teckenuppsättning kan innehålla upp till 96 tecken och representeras av en sekvens på två eller tre byte, en dubbel byte teckenuppsättning kan innehålla upp till 9216 (96 x 96) tecken och representeras av en sekvens på tre eller fyra byte. Vi har valt ut oftast använda teckenuppsättningar som definieras PRIMARY. Alla andra teckenuppsättningar som läggs till definieras SECONDARY. Till exempel, i serien kinesiska (taiwanesiska) teckenuppsättningar CNS11643 är de två första PRIMARY medan resten är SECONDARY (Se Tabell 1). Bild 1 visar användning av en byte kodområdet.
| 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 |
Ett kodningssystem, eller en kodningsmekanism, är ett sätt att koda text. Många olika kodningssystem kan avvändas på datorer. Olika länder använder olika kodningssystem. Mule konverterar därför automatiskt koder från olika representationsformat till dess interna multi-byte format närhelst Mule växelverkar med omvärlden genom läsa/skriva dokument, kommunicera med andra processer eller ta emot/skicka data från/till terminaler.
För göra kodkonvertering reglerbar och utbyggbar har vi undvikit utrusta Mule med en hårdkodad konverteringsrutin. Vi använder istället en generisk kodningssystemmodell med flera parametrer som kan definieras. Turligt nog passar de flesta kodningssystemen som används i världen inom ramen för ISO 2022. Vi kategoriserade därför ett kodningssystem i ISO-2022 typ och icke-ISO-2022 typ. För det förra skapade vi en generisk ISO 2022 interpretator. För det senare skapade vi ett enkelt programmeringsspråk CCL (Code Conversion Language) och CCL interpretatorn.
När användare specificerar ett kodningssystem för vissa processupp-gifter (t ex läsa dokument, skicka post), aktiverar Mule automatiskt ISO 2022 interpretatorn eller den CCL interpretator som specificerats för kodningssystemet.
Fastän ISO 2022 medger många variationer för koda samma text används faktiskt bara ett fåtal. För specificera kodning är ett litet antal parametrer listade i Tabell 3 tillräckliga. Tll exempel, kinesiska, japanska och koreanska varianter av EUC (Extended UNIX Code) och alla ISO-8859 serier (Avsnittsnummer 1-10) skiljer sig bara genom parametrarnas ursprungliga och reserverade designationer. De andra exemplen är 7-bit ISO-2022 serierna såsom ISO-2022-JP, ISO-2022- JP-2, ISO-2022-KR och ISO-2022-CN, som alla använder 7-bit miljön. Dom skiljer sig bara genom reserverade designationer och låsande skift. De två första använder inte låsande skiftfunktion, medan resten gör det.
| parameter | värde | innebörd |
| ursprungliga designationer | charset-id lista | Vilken teckenuppsättning som initialt designeras för varje grafiskt register. |
| reserved designations | charset-id lista | Vilken teckenuppsättning som designeras för exklusiv kodning för varje grafiskt register. |
| 7-bit miljö | rätt / fel | Använd endast lägre 7-bit eller full 8-bit kodning. |
| låsande skift | rätt / fel | Använd låsande skiftfunktion eller ej. |
| skift | rätt / fel | Använd skiftfunktion eller ej. |
| riktningsangivning | rätt / fel | använd en ISO-6429 escapesekvens för ange skrivriktning vid kodning |
Tabell 4 visar enkelt hur ett typiskt ISO-2022 kodningssystem i Mule definierars. När kodningssystemet definierats kan det specificeras för varje situation där kodkonvertering krävs. Till exempel, efter defini- tionen i tabell 4 kan användare läsa/skriva GB dokument och visa kinesiska tecken på GB terminal, samt skicka/mottaga GB post.
'*euc-china* ;; Kodningssystemnamn
2 ;; Typ, '2' betyder ISO-2022 typ
?C ;; Mnemotekniskt tecken i kodnings-systemet
t ;; auto-detect end-of-line typ (CR, CRLF, LF)
(list lc-ascii lc-cn ;; GO är ASCII. GI är kinesisk GB2312
nil nil ;; G2 och G3 används aldrig.
Typiska exempel av icke-ISO-2022 kodningssystem är ryska KOI-8 och vietnamesiska VISCII. Fastän KOI-8 uppfyller de tekniska kraven för ISO 2022 är teckenkodpunkterna olika ISO 8859-5 (latinska/cyrilliska alfabeten) som är defaultuppsättningen för cyrilliska tecken i Mule.
VISCII använder fulla 8-bit koder för 134 specifika vietnamesiska tecken, som inte uppfyller de tekniska kraven för för ISO 2022. I Mule delas därför den vietmanesiska teckenuppsättningen upp i små och stora bokstäver som var för sig tilldelas en charset-id.
Medan den generiska ISO 2022 interpretatorn inte kan användas för avkoda eller koda dessa teckenuppsättningar har vi försett Mule med CCL konverteringsprogram. CCL är ett enkelt men effektivt pro- grameringsspråk lämpligt för skriva konverteringsalgoritmer, och innebär att Mule teoretiskt kan hantera varje slags kodningssystem med lämpligt CCL program.. Tabell 5 visar CCL programkällan för koda 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.")
Vi har undersökt existerande inmatningsmetoder för mångspråkiga tecken och delat upp dessa i följande fyra kategorier.
Till exempel, med japansk inmatningsmetod skrivs först en hiragana- sekvens (japanska fonetiska alfabetet), som sedan konverteras av ett konverteringsprogram till lämplig kanji- (kinesiska tecken) och hiragana- sekvens. Det finns flera konverteringsprogram, t ex Wnn, Canna, SJ3 (alla för japanska), och cWnn (för kinesiska), som kan användas i Mule. Dom använder vanligen mycket omfattande ordböcker och grammatik för skapa lämplig teckensekvens.
Quail paket kan lätt skräddarsys för olika ändamål. Nya översättnings- regler kan enkelt skapas eller redan existerande modifieras. Quail paketets modulsystem gör det lätt att lägga till nya regler för ett nytt språk. Det kan enkelt göras genom att skapa och namnge ett nytt paket samt definiera antalet översättningsregler i paketet. Tabell 6 visar hur man skapar ett nytt Quail paket som simulerar "Caps-Lock" (dvs. alla små bokstäver översätts till stora).
;; Definiera först nytt Quail paket.
(quail-define-package "caps-lock"
"Caps-Lock" nil "Simulate Caps-Lock")
;; Definiera sedan översättningsreglerna för paketet.
(quail-defrule "a" "A")
...
Inmatningsmetoder av senare slaget möjliggörs med Tamagosystemet. Tamago översätter först tangentbordinmatning till fonetiska koder (Hiragana i japanska och PinYin eller ZhuYin i kinesiska) som skickas till externt konverteringsprogram via networks. Quailsystemet kan användas från början. Tamago utvecklades emellertid oberoende av Quail och har i nuläget ett eget system för skapa dess fonetiska koder. Då konverteringar inte kan automatiseras helt bör andra konverteringsmetoder användas var för sig växelvis. Tamago kan i nuläget använda Wnn och cWnn som konverteringsserver.
Textbehandling är mycket mer än teckeninmatning. Mule erbjuder flera verktyg för underlätta textbehandling, t ex teckenkategorier och en effektiv compiler för snabbt söka ofta förekommande ord och uttryck.
Teckengrupper kan lätt programeras för bekväm textredigering med tangentkommandon, t ex för söka visst cyrilliskt tecken men inte specificera alla dessa för kombinera med OR operatörer. För detta ändamål tilldelar GNU Emacs varje tecken en teckensyntaxkod, som dock har vissa begränsningar. Varje tecken kan som mest ha en enda teckensyntax såvida inte en ny definieras.
Mule erbjuder ett ytterligare sätt för kategorisera teckengrupper. Ny teckenkategori kan definieras genom tilldela varje tecken ett valfritt antal teckenkategorier. Tabell 7 visar Mules defaultteckenkategorier. Textredigering innebär ofta ord-för-ord behandling på många språk med olika orddefinitioner. I Mule definieras ord enligt teckenkate-gorier för skräddarsydda redigeringskommandon för speciella ändamål.
| 'b' | Arabiska tecken |
| 'c' | Kinesiska 2-byte tecken |
| 'g' | Grekiska tecken |
| 'h' | Koreanska 2-byte tecken |
| 'j' | Japanska 2-byte tecken |
| 'k' | Japanska 1 byte Katakana tecken |
| 'r' | Japanska 1 byte Roman tecken |
| 'l' | Latinska tecken |
| 'w' | Hebreiska tecken |
| 'y' | Cyrilliska tecken |
Mångspråkig textvisning kan göras på två sätt. Med Mule från dator- terminal (eller datorterminal emulator typ `xterm', `kterm', `cxterm', etc.), och köra Mule med ett fönstersystem.
I förra fallet skickar Mule korrekt kodad text till terminalerna som tar över uppgiften att skapa mångspråkig text. Kodkonvertering görs enligt kodningssystem specificerat för terminalutmatning. Till exempel, om `cxterm' används för Mule kan endast engelsk eller kinesisk text visas.
Med windowsystem tar Mule ansvaret för visa mångspråkig text. I Mule tilldelas varje teckenuppsättning en motsvarande font. En samling teckenlayouts från alla teckenuppsättningar och motsvarande fonter kallas fontuppsättning och är basen för visa varje tecken på bildskär-men. Mule använder olika fontuppsättningar för olika sammanhang. Till exempel, för läsa elektronisk post visas ämnesområdet med fet text, och fetfontsuppsättningen används endast för ämnesområdet.
Med X fönster regleras Mules interna teckenkoder vanligtvis med kodningspunkterna i motsvarande font. Till exempel, den japanska teckenuppsättningen JIS X0208 visas korrekt med fonten vars tecken- kodning motsvarar JIS X0208. Men även om viss teckenuppsättning och font inte kan kombineras kan interna kodningspunkter konverteras med CCL för varje font, som förklarades i tidigare avsnitt. Till exempel, Mules cyrilliska teckenuppsättning baserad på ISO 8859-5 med endast K0I-8 fonten tillgänglig. Även i detta fall behöver bara layouten för fontuppsättningen ändras för använda K0I-8 fonten för cyrillisk tecken- uppsättning och tilldela lämpligt CCL program för cyrillisk teckenupp- sättning. (se Tabell 8).
För utöka systemsupport för ett nytt språk är det bara att lägga till en layout mellan den nya teckenuppsättningen för språket och en lämplig font till redan existerande fontuppsättningar.
;; Ändra fontlayout i fontuppsättningen 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.")
;; Tilldela CCL programmet cyrilliska teckenuppsättningen LC-CRL.
(x-set-ccl lc-crl ccl-x-koi8)
Vi har beskrivit Mules mångspråkiga textredigeringssystem med tonvikt på dess reglerbara och utbyggbara egenskaper. För dessa ändamål har Mule utrustats med Emacs Lisp interpretator som gör systemet öppet. Enkla Emacs Lisp program kan skräddarsys för alla individuella behov.
Mule kom ut på marknaden 1993. Sedan dess har folk världen över bidragit många supportfunktioner för de egna språken, och Mule kan nu hantera de flesta européiska språk (inklusive ryska och grekiska) och östasiatiska språk ( kinesiska, japanska, koreanska) samt också thai, vietnamesiska, hebreiska, arabiska, turkiska och andra. Vi arbeter nu intensivt för inkludera alla indiska språk (devanagali skrift).
Utöver supportfunktioner för nya språk finns nu också många Mule applikationer, såsom on-line ordböcker, MIME kodare och avkodare. Alla dessa verktyg bekräftar Mules framtida möjligheter i en mång- språkig arbetsmiljö än mer bara som ett enkelt textredigeringssystem.
Mule integrerars nu i GNU Emacs genom nära samarbete med Free Software Foundation, som distribuerar GNU Emacs. Framtida GNU Emacs på marknaden kommer ha Mules mångspråkiga funktionsfacili- teter.
Mule distribueras gratis enligt villkoren för GNU GENERAL PUBLIC LICENSE. Mule Version 2.3 kan anskaffas genom anonymous ftp på följande platser och många andra.