Mécanisme standardisé et extensible des traitements de texte multilingues

Kenichi Handa, Mikiko Nishikimi, Satoru Tomura, Naoto Takahashi

Electrotechnical Laboratory
Umezono 1-1-4, Tsukuba, 305 JAPAN

Résumé

Les deux principales difficultés avec les systèmes de traitement de texte multilingues sont (1) la standardisation du mécanisme pour plusieurs langues, (2) la flexibilité et l'extensibilité des fonctions du système. Cet article explique comment ces deux problèmes ont été résolus dans le cas du système Mule (Multilingual Enhancement to GNU Emacs - Perfectionnement du didacticiel GNU Emacs pour le multilingue). Le système Mule est un éditeur de texte pleine page qui peut être exécuté avec différents systèmes d'exploitation (UNIX, DOS, Windows et OS/2 sur plusieurs plate-formes matérielles). Il offre aux utilisateurs un système de traitement de texte multilingue souple permettant non seulement d'éditer des textes mais encore de lire/écrire les messages électroniques et les News, d'explorer les pages Web, etc. Toutes ces fonctions sont commandées par un mécanisme standardisé, elles sont entièrement flexibles et les utilisateurs peuvent les étendre eux-mêmes.

1. Introduction

Grâce aux progrès remarquables de la technologie informatique, les ordinateurs ont maintenant suffisamment de capacité pour traiter bien d'autres langues que l'anglais. Un certain nombre de pays ont déjà finalisé les moyens d'utiliser leur langue nationale, la plupart sur la base de mécanisme localisés, ce qui ne causait pas de problèmes tant que l'on restait dans un environnement informatique local. Mais depuis que le réseau Internet rapproche le monde entier, il est indispensable de faciliter la communication entre différents paramètres de lieu/pays/langues. Nous sommes confrontés aujourd'hui à la difficulté de traiter plusieurs langues en même temps, cela parce que chaque région a mis au point son propre système sans tenir compte des autres localisations.

Mule a été mis au point pour résoudre le problème des langues. C'est un éditeur de texte pleine page conçu à partir du didacticiel GNU Emacs, un des éditeurs les plus connus et les plus utilisés dans le monde UNIX. Sa caractéristique la plus importante est d'être doté d'un interpréteur Emacs Lisp. La plupart de ses fonctions sont configurées en langage Emacs Lisp, ce qui veut dire qu'il suffit d'ajouter ou de modifier les programmes Emacs Lisp pour augmenter le didacticiel GNU Emacs. Emacs est utilisable pour les travaux d'édition, pour les traitements de textes y compris la lecture/écriture des messages électroniques et des News, pour explorer les pages de la toile (le Web), référencer les manuels, consulter les dictionnaires en ligne, etc. Tout cela est possible avec les programmes Emacs Lisp, et de plus entièrement personnalisable.

Mule hérite de toutes ces fonctions qu'il peut utiliser dans un environnement multilingue. Les utilisateurs de Mule peuvent par exemple échanger du courrier électronique ou lire les pages Web en plusieurs langues, dans la mesure où ce sont des langues prise en charge par Mule.

Lors de la conception de Mule, nous avions deux idées en tête :

Le plus difficile et en même temps le plus important dans le cas du traitement de texte multilingue est de standardiser un mécanisme qui pourrait traiter plusieurs langues sans perdre les avantages acquis par les localisations de chaque langue. Le traitement de texte en plusieurs langues diffère d'une langue à l'autre en plusieurs points : par le jeu de caractères utilisés, par le mode d'affichage à l'écran, par la façon de saisir le texte à partir du clavier, par le mécanisme de codage utilisé pour les fichiers. Le traitement multilingue implique un mécanisme standardisé qui recouvre toutes ces pluralités.

Autre élément important : la flexibilité et l'extensibilité, c'est-à-dire la possibilité de personnaliser ou d'ajouter des fonctions sans difficulté. Il est pratiquement impossible de prévoir et offrir à l'avance toutes les fonctions nécessaires à toutes les langues prises en charge, d'autant que leur nombre augmentera dans le futur et que l'environnement standard des langues nationales sera certainement modifié dans les pays développées ; les systèmes rigides qui ne permettraient pas de modifier ou d'ajouter des fonctions seraient très vite périmés ou seraient trop difficiles à adapter à une autre langue.

Par conséquent nous n'ajoutons pas les fonctions qui seront nécessaires à une langue donnée dès le départ, même si nous les connaissons. Nous analysons d'abord si éventuellement d'autres langues nécessitent une fonction similaire, dont une partie devra être généralisée pour toutes les langues et une partie sera laissée telle quelle avec possibilité d'être modifiée. Une fois que ces éléments sont décidés, nous envisageons la fonction la plus polyvalente.

Le traitement de texte est très complexe. Il implique au minimum la saisie, l'enregistrement, la restauration et l'affichage de texte. Lorsque nous parlons de langue prise en charge par Mule, cela veut dire que Mule peut au minimum :

Nous utilisons le terme « standard » non seulement dans le sens de « norme officielle » mais aussi dans le sens de « norme de facto ». De plus, le traitement de texte implique que soit traités des caractères, des mots et des lignes dans le respect des règles d'écriture officielles de chaque langue. Toutes ces fonctions sont commandées par un mécanisme uniformisé de traitement des jeux de caractères, des systèmes de codage, des mécanismes d'entrée, et des programmes d'affichage.

Les chapitres qui suivent expliquent :

Chapitre 2
Comment Mule traite les caractères intérieurement
Chapitre 3
La corrélation entre Mule et le monde extérieur où sont utilisés différents mécanisme d'encodage.
Chapitre 4
Comment on pourra entrer un texte en plusieurs langues à partir d'un clavier standard anglais.
Chapitre 5
Comment Mule traite les règles d'écriture de différentes langues.
Chapitre 6
Comment Mule affiche un texte multilingue à l'écran.
Chapitre 7
Résumé, état actuel de Mule et travaux futurs.

2. Représentation interne d'un texte multilingue

Un jeu de caractères est un groupe de caractères utilisés ensembles pour taper un texte régional (c'est-à-dire un texte anglais, un texte japonais, etc.). Bien que pour les réalisateurs de systèmes informatiques le rêve le plus doux serait d'avoir un unique jeu universel de caractères qui intégrerait toutes les langues, mais pour l'instant cela reste impossible. La norme ISO 10646 (ou Unicode) de l'Organisation internationale de normalisation n'est pour l'instant d'aucune utilité pour représenter les caractères chinois du fait de son incompatibilité à traiter l'unification CJK. C'est pourquoi nous avons décidé d'intégrer de multiples jeux de caractères dans Mule.

La plupart des jeux de caractères Mule correspondent un par un avec les jeux de caractères enregistrés dans les normes ISO (ISO 8859-1, JIS X0208). Un jeu de caractère ISO est identifié par sa taille (nombre de caractères contenus) et par la caractère final, (code sur un octet pour distinguer les jeux de caractères de même taille), alors qu'un jeu de caractère Mule est identifié par un simple numéro appelé indicatif du jeu de caractères. Donc, définir un jeu de caractère avec Mule signifie associer un seul indicatif de jeu de caractères au jeu de caractères ISO correspondant, et d'indiquer à Mule tous les paramètres du jeu de caractères. Ces paramètres, utilisés pour l'édition impliquent la largeur d'affichage, le sens d'écriture, etc. Nous donnons quelques exemples de jeux de caractères au tableau 1.

Tableau 1. Exemples de jeux de caractères
Jeu de caractères ISO paramètres utilisés dans Mule
Nom taille caractère final indicatif du jeu de caractères octets largeur sens d'écriture
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
Dans ce tableau, les octets correspondent à la longueur d'une représentation interne de Mule en octet, la largeur correspond au nombre de colonnes occupées sur l'écran, le sens d'écriture est le sens de déplacement : gauche à droite, droite à gauche.

Il est également possible de définir un jeu de caractères non enregistré dans la norme ISO. Dans ce cas, Mule utilise le caractère final réservé par ISO pour les utilisations spéciales. Lorsque au départ un jeu de caractères ne correspond pas aux critères techniques de la norme ISO 2022, il faudra le réorganiser pour le rendre conforme soit en le divisant en jeux de caractères plus petits, soit en modifiant les points du code de caractère. Le jeu de caractères du vietnamien est un exemple typique que nous décrirons au chapitre suivant.

La façon la plus courante et la plus simple de garder un texte dans la mémoire de l'ordinateur est de représenter chaque caractère par un ensemble d'éléments de longueur définie (sur un à quatre octets). Avec un texte multilingue il ne sera pourtant pas possible de couvrir les caractères de toutes les langues du monde avec seulement un ou deux octets par caractère. Avec quatre octets on aurait une marge suffisante mais pour les seuls textes en anglais, ce serait un gaspillage de mémoire. C'est pourquoi, dans les mémoires tampons Mule les caractères sont codés avec des longueurs variables sur des octets multiples (que nous désignerons en abrégé codage sur octets multiples dans le reste du texte) au lieu d'être codées avec des longueurs fixes, et ce pour des raisons d'extensibilité et d'utilisation efficace de la mémoire. (Cette idée a été introduite dans le mémo de Stallman).

Avec le codage à octets multiples, chaque caractère de l'indicatif du jeu est représenté sur un ou deux octets des principaux codes et le code de caractère est représenté sur l'octet ou les deux octets qui suivent. Une seule exception pour les caractères ASCII qui sont représentés tels quels, avec l'indicatif de jeu de caractère 0. Nous indiquons tableau 2 la définition la plus formelle de la représentation interne des caractères de Mule.

Tableau 2 Définition formelle de la représentation interne des caractères
    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
 

Dans ce tableau, PRIMARY_CHA (caractère principal) et SECONDARY_ CHA (caractère secondaire) ne diffèrent que du point de vue de la mémoire nécessaire à chaque caractère ; il n'y a aucune différence entre eux en édition. L'indicatif du jeu de caractères est simplement représenté par LEADING_CODE_PRI (Code de tête principal - dans ce cas de 129 à 154) ou par une séquence de LEADING_CODE_SEC (Code de tête secondaire) et LEADING_CODE_EXT (Code de tête étendu) (Dans ce cas supérieur à 160). Un jeu de caractères à un octet peut contenir jusqu'à 96 caractères représentés par une séquence de deux ou trois octets, un jeu de caractères à double octet peut contenir jusqu'à 9216 (96 x 96) caractères représentés par une séquence de trois ou quatre octets. Nous avons sélectionné les jeux de caractères les plus fréquemment utilisés que nous avons définis comme caractères secondaires. Dans la série CNS11643 des caractères chinois par exemple (Chinois de Taiwan), les deux premiers caractères clairs sont PRINCIPAL mais les autres caractères clairs sont SECONDAIRE (voir tableau 1). Nous montrons figure l'utilisation d'une zone de codage sur un octet.

Figure 1. Utilisation d'une zone de codage sur un octet
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

3. Système de codage

Un système de codage, ou un mécanisme d'encodage, est un moyen d'encoder un texte. Plusieurs systèmes de codage sont utilisés sur les ordinateurs et chaque pays utilise des systèmes de codages différents. C'est pourquoi Mule convertit automatiquement les codes des différents formats de représentation de texte en codes du format multi-octet interne, chaque fois que Mule entre en correlation avec le monde extérieur c'est-à-dire lors de la lecture/écriture de fichiers, communication avec un autre système de traitement, réception des données d'un autre ordinateur, ou transmission de données vers un autre ordinateur.

Nous avons évité de doter Mule d'un programme de conversion incorporé pour finaliser un procédé de conversion de code qui reste flexible et extensible. Nous lui avons préféré un système de codage à modèle générique incluant plusieurs paramètres à rentrer. Heureusement la plupart des systèmes de codage actuellement utilisés dans le monde rentrent dans le cadre de la norme ISO 2022. Par conséquent, nous avons classé un système de codage en deux catégories : ISO-2022 et non-ISO-2022. Nous avons créé un interpréteur générique ISO 2022 pour la première catégorie, et conçu un langage de programmation CCL simple (Code conversion Language - langage de conversion de code) pour la deuxième catégorie ainsi qu'un interpréteur CCL.

Lorsque pour certaines fonctions de traitement les utilisateurs spécifient un système de codage (par exemple la saisie d'un fichier ou la transmission d'un courrier électronique) Mule fait automatiquement appel à l'interpréteur ISO-2022 ou à l'interpréteur CCL selon le système de codage spécifié.

3.1 Système de codage ISO-2022

Bien que l'encodage d'un texte puisse être fait dans des formes très variées avec la norme ISO 2022, dans la pratique seules un petit nombre de variations sont utilisées. Ainsi pour spécifier un encodage, il suffit de connaître les quelques paramètres indiqués au tableau 3. Par exemple les variantes chinoises, japonaises et coréennes du code EUC (Extended UNIX code - Code UNIX étendu) et toutes les séries ISO-8859 (numéro 1 à 10) diffèrent uniquement par la désignation initiale des paramètres et par les désignations réservées. Un autre exemple avec la série ISO-2022 à 7-bits ; les systèmes ISO-2022-JP, ISO-2022-JP-2, ISO-2022-KR et ISO-2022-CN utilisent toujours un environnement à 7 bits, leur différence provenant uniquement des désignations réservées et de la fonction de maintien (inversion avec verrouillage) qui n'est pas utilisée pour les deux premiers alors que les autres l'utilisent.

Tableau 3 Paramètres du système de codage ISO-2022
paramètre valeur signification
désignations initiales liste des indicatifs de jeux de caractères Quel jeu de caractère est initialement attribué pour chaque registre graphique.
Désignations réservées liste des indicatifs de jeux de caractères Quel jeu de caractère est exclusivement attribué à l'encodage pour chaque registre graphique.
environnement à 7 bits vrai / faux Utilise uniquement le 7 bits inférieur ou le 8 bits complet à l'encodage.
inversion avec verrouillage vrai /faux Utilise ou non la fonction d'inversion avec verrouillage.
inversion simple vrai / faux Utilise ou non la fonction d'inversion.
indication de sens d'écriture vrai / faux utilise une séquence d'échappement de ISO-6429 pour indiquer le sens d'écriture à l'encodage.

Le tableau 4 montre combien il est facile de définir un système d'encodage de type ISO-2022 avec Mule. Une fois que le système d'encodage est défini, on pourra le spécifier pour toutes les situations données qui nécessitent une conversion de code. Après la définition du tableau 4 par exemple, les utilisateurs pourront lire/écrire des fichiers GB (variante chinoise des codes EUC) et afficher des caractères chinois sur un ordinateur qui supporte les codes GB ou échanger du courrier électronique en GB.

Tableau 4. Définition des codes chinois EUC (appelés GB) avec le système Mule
'*euc-china*            ;; Nom du système de codage
2                       ;; Type, '2' signifie ISO-2022
?C                      ;; Caractère mnémonique du système de codage
t                       ;; à détection automatique des fins de ligne
(liste lc-ascii  lc-cn  ;; G0 pour ASCII, G1 pour le chinois GB2312
       nil    nil       ;; G2 et G3 jamais utilisés
 

3.2 Système de codage non-ISO-2022

Le russe KOI-8 et le vietnamien VISCII sont deux exemples de codage non-ISO-2022. Si KOI-8 est conforme aux critères techniques de la norme ISO 2022, il n'en reste pas moins que les points de code des caractères sont différents de ceux de la norme ISO 8859-5 (alphabet latin/cyrillique), jeu de caractères par défaut de Mule pour les caractères cyrilliques.

VISCII utilise les codes à 8 bit complets pour la gamme des 134 caractères vietnamiens, ce qui ne concorde pas avec les spécifications techniques requises par la norme ISO 2022. Donc Mule divise le jeu de caractères vietnamiens en deux, les lettres minuscules et les lettres majuscules, et un indicatif de jeu est assigné à chacun des deux jeux obtenus.

Puisque l'interpréteur générique ISO 2022 n'est pas utilisable pour le décodage et l'encodage de ces jeux de caractères, nous avons doté Mule de programmes de conversion CCL. CCL est un langage de programmation simple mais puissant qui convient pour écrire les symboles de conversion de codes, c'est-à-dire qu'en principe Mule peut traiter n'importe quel système de codage dans la mesure où il est doté d'un programme CCL approprié. Au tableau 5 nous indiquons l'origine du programme CCL utilisé pour l'encodage de KOI-8.

Tableau 5. Programme CCL pour l'encodage du système 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.")
 

4. Méthode d'entrée

Nous avons étudié les différentes méthodes qui existent pour la saisie de caractères multilingues et les avons réparties dans les quatre catégories suivantes.

(1) Application des touches
La méthode d'entrée la plus simple qui consiste à faire correspondre les touches d'un clavier anglais ordinaire à d'autres caractères, un par un. Comme exemples typiques, citons le grec et le russe.
(2) Combinaison de touches
Méthode d'entrée qui reproduit un caractère composé qui combine plusieurs séquences de touches. Comme exemple typique citons les langues européennes et le vietnamien pour lesquelles des signes diacritiques et des signes de tonalité sont générés à partir de l'alphabet et de quelques touches de symbole. Avec la méthode d'entrée vietnamienne le caractère (a( est reproduit avec la séquence de touches a^'. Il y a aussi un certain nombre d'entrées de ce type en chinois, mais il faut dans le cas de cette langue beaucoup d'entraînement à cause du nombre gigantesque d'idéogrammes qu'elle comporte.
(3) Association de (1) et de (2)
C'est une méthode d'entrée qui dans un premier temps fait correspondre les touches puis reproduit des caractères composés par combinaison des touches repérées. Le thaïlandais et le coréen sont des exemples typiques de ce type d'entrée. En thaïlandais par exemple les dessus de touches sont marqués avec des consonnes, voyelles ou signes de tonalité thaïlandaises tandis qu'une séquence de touches formée d'une consonne suivie d'une voyelle ou d'un signe de tonalité reproduit un caractère composé avec la voyelle et/ou le signe de tonalité au dessus ou au dessous de la consonne.
(4) (3) plus un programme de conversion externe
Cette méthode est utilisée pour la saisie des caractères chinois. Avec cette langue, qui comporte plus de dix mille idéogrammes, il est impossible de mémoriser toutes les combinaisons de touches. En revanche il sera très facile d'entrer des caractères phonétiques. Nous pourrons donc créer une méthode d'entrée si nous donnons aux utilisateurs la possibilité d'accéder à des caractères phonétiques avec (1) ou (3), et de passer ensuite à la tâche suivante qui consiste à reproduire les caractères chinois avec l'ordinateur.

La méthode d'entrée du japonais par exemple fait appel à la saisie d'une séquence de caractères hiraganas (alphabet phonétique japonais), laquelle séquence est ensuite convertie en une séquence où sont mélangés les kanjis (idéogrammes chinois) et les kanas (katakana ou hiragana - deux alphabets japonais en usage) à l'aide d'un programme de conversion. Mule peut utiliser un certain nombre de programmes de conversion dont Wnn, Canna, SJ3 (tous pour le japonais) et cWnn (pour le chinois). Il leur faut en principe des dictionnaires énormes et une vaste connaissance de la grammaire de chaque langue pour pouvoir reproduire convenablement les séquences de caractères.

Avec Mule, les entrées des trois premières méthodes sont saisies avec un traducteur d'entrée au clavier appelé Quail. Quail recueille un jeu de règles de traduction à la fois (appelé ensemble Quail) et traduit la saisie de l'utilisateur en conséquence. Chaque règle de traduction est constituée d'une séquence de touche et de la traduction correspondante en texte. A une règle peut correspondre plusieurs textes traduits, auquel cas l'utilisateur est invité à choisir une des alternatives en mode interactif. Il est relativement facile de personnaliser un ensemble Quail. L'utilisateur n'aura qu'à ajouter de nouvelles règles de traduction ou à modifier celles qui existent. Un ensemble Quail étant conçu sous forme de module, il est facile d'ajouter d'autres règles quand on a une langue nouvelle. Il suffit de constituer un nouvel ensemble et de lui donner un nom adéquat, et de définir un nombre de règles de traduction quelconque pour cet ensemble. Le tableau 6 indique comment faire un nouvel ensemble Quail qui simule le verrouillage des majuscules (c'est-à-dire que les minuscules sont converties en majuscules).

Tableau 6 Exemple de constitution d'un ensemble Quail « verrouillage majuscule »
;;  Tout d'abord définir un nouvel ensemble Quail
(quail-define-package "caps-lock"
                      "Caps-Lock" nil "Simulate Caps-Lock")
;;  Ensuite, définir les règles de traduction de cet ensemble.
(quail-defrule "a" "A")
   ...
 

Les méthodes de saisie du dernier type sont réalisées avec un système appelé Tamago. Ce système traduit d'abord les entrées du clavier en codes phonétiques (hiragana pour le japonais et pinyin ou zhuyin pour le chinois) qu'il transmet à un programme de conversion externe via le réseau. On peut aussi utiliser le système Quail dès le premier niveau. Cependant pour le moment nous avons mis Tamago au point indépendamment de Quail et donc il intègre son propre système pour reproduire les codes phonétiques. Etant donné que les conversions ne sont pas entièrement automatiques, l'utilisateur aura à sélectionner un convertisseur interactif quelconque. Pour le moment Tamago utilise les serveurs de conversion Wnn et cWnn.

5. Traitement de texte

Le traitement de texte implique beaucoup plus qu'une simple saisie de caractères. Mule offre différents outils pour faciliter les tâches, par exemple les catégories de caractères et la recherche rapide dans le puissant dictionnaire des expressions courantes.

Pendant l'édition d'un texte il sera pratique de regrouper certains caractères et d'utiliser ce groupe pour les commandes d'édition. L'utilisateur voudra par exemple chercher un caractère cyrillique sans avoir à spécifier l'ensemble des caractères cyrilliques et à les combiner avec les opérateurs OU. C'est pour cela qu'à l'origine le système Emcs GNU assignait un code de syntaxe de caractère à chaque caractère. Mais les syntaxes de caractères présentent certaines restrictions puisqu'il ne peut pas y avoir plus d'une syntaxe par caractère et que les utilisateurs ne peuvent pas définir de nouvelles syntaxes.

Mule offre un autre moyen de regrouper les caractères : le groupage par catégories. Les utilisateurs peuvent définir de nouvelles catégories de caractères et assigner autant de catégories qu'ils le souhaitent à un simple caractère. Le tableau 7 représente les catégories de caractères par défaut de Mule. L'édition implique souvent un travail mot par mot alors que par ailleurs la définition de ce qu'est un mot ne soit pas la même dans toutes les langues. Avec Mule, les utilisateurs peuvent définir un mot sur la base des catégories de caractères, ce qui permet de personnaliser les commandes de l'édition.

Tableau 7. Catégories de caractères par défaut
'b' Caractères arabes
'c' Caractères chinois à 2 octets
'g' Caractères grecs
'h' Caractères coréens à 2 octets
'j' Caractères japonais à 2 octets
'k' Caractères katakanas japonais à 1 octet
'r' Caractères latins japonais (romanji) à 1 octet
'l' Caractères latins
'w' Caractères hébreux
'y' Caractères cyrilliques
Caractères chinois de Taiwan

6. Affichage

Pour afficher du texte en plusieurs langues il nous faut considérer deux cas : exécuter Mule à partir d'un terminal (ou émulateur de terminal tel que ' xterm', 'kterm' 'cxterm' etc.) ou exécuter Mule avec un système à fenêtres.

Dans le premier cas, Mule ne fait qu'envoyer le texte encodé vers le terminal, laissant le soin à chaque terminal de rendre le texte dans les différentes langues. La conversion des codes est effectuée en corrélation avec le système de codage spécifié pour la sortie du terminal. Par exemple lorsque Mule est exécuté à partir d'un émulateur 'cxterm', il ne sera pas possible d'afficher autre chose que de l'anglais et du chinois.

Lorsque Mule est exécuté avec un système à fenêtres, l'affichage du texte en plusieurs langues est commandé par Mule. A chaque jeu de caractères correspond une police ; une mise en correspondance des jeux de caractères avec une police appropriée est appelée jeu de polices de caractères et sert de base à l'affichage des caractères. Mule peut utiliser différents jeux de polices selon les contextes. Si par exemple, un champ d'objet est affiché en gras dans un message électronique, les jeux de police du groupe de polices en gras seront utilisés à la lecture du message uniquement pour le champ d'objet.

Sur les systèmes à fenêtres X, les codes de caractères internes Mule correspondent en général aux points de code de la police de caractère homologue. Le jeu de caractères japonais JISX0208 peuvent par exemple s'afficher correctement avec une police dont les points de caractères acceptent JISX0208. Mais, même si cette correspondance n'est pas valable pour un certain nombre d'association de jeux et de police de caractères il sera possible de convertir les points de code de caractères internes à l'aide du programme CCL dont nous avons parlé au chapitre précédent en points de code de police. Le jeu de caractères cyrilliques de Mule est basé par exemple sur la norme ISO-8859-5, mais l'utilisateur n'a qu'une police KOI-8 ; dans ce cas tout ce qu'il aura à faire sera de modifier l'application du jeu de polices pour que la police KOI-8 soit utilisée pour les jeux de caractères cyrilliques et associer un programme CCL approprié aux jeux de caractères cyrillique (voir tableau 8).

Lorsque l'utilisateur ajoute une nouvelle langue à prendre en charge il peut simplement faire une nouvelle correspondance entre le nouveau jeu de caractères de la langue ajoutée et la police appropriée du jeu de polices qu'il possède.

Tableau 8. Exemple d'utilisation de la police IOI8 pour les caractères cyrilliques
  ;; Change la mise en correspondance des polices dans le jeu de polices DEFAULT-FONTSET (jeu par défaut)
  (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.")
  ;; Associe un programme CCL au jeu de caractères cyrilliques LC-CRL
  (x-set-ccl lc-crl ccl-x-koi8)
  

7. Conclusion

Notre description de l'éditeur de texte multilingue Mule, met l'accent surtout sur sa flexibilité et son extensibilité. Mule est doté d'un interpréteur Emacs en langage Lisp qui en fait un système ouvert, puisque les programmes Emacs en langage Lisp peuvent exécuter toutes sortes d'adaptations personnalisées.

Depuis le lancement de Mule en 1993 nombreux sont ceux qui ont contribué de par le monde à peaufiner la prise en charge de leur propre langue. Mule est aujourd'hui capable de traiter la plupart des langues européennes (y compris le russe et le grec) et d'extrême orient (chinois, japonais, coréen), ainsi que le thaïlandais, le vietnamien, l'hébreu, l'arabe, le turc et bien d'autres. Nous faisons tout notre possible actuellement pour prendre en charge les langues indiennes (en devanagali).

En plus de la prise en charge de langues nouvelles, de nombreuses applications sont exécutables avec Mule, comme par exemple l'outil de consultation en ligne des dictionnaires, l'encodeur et le décodeur MIME. Ces outils prouvent que Mule est un véritable poste de travail/environnement multilingue et non un simple éditeur.

Nous sommes en train d'intégrer Mule dans le logiciel GNU Emacs d'origine en coopération avec la Free Software Foundation, organisation chargée de sa distribution. Lors de la sortie d'une nouvelle version du logiciel GNU Emacs les fonctions multilingues seront intégrées.

Annexe : Distribution de Mule

Mule est distribué gratuitement dans les conditions prévues par la LICENSE PUBLIQUE GENERALE GNU. La version 2.3 de Mule est disponible en différents protocoles de transfert de fichiers anonymes à partir des sites suivants ou autres sites miroirs.