Cours PLURITAL 2012-2013

Cours n° 5 (26 novembre 2013)

Jean-François Perrot

Unicode (fin)

  1. Informations relatives aux caractères Unicode
    1. Le répertoire UNIDATA
    2. Exemple

  2. L'affichage du texte
    1. Principe : Ordre de lecture
    2. Ordre d'écriture
    3. Signes diacritiques
    4. Liaisons, ligatures et autres modifications liées à la position du caractère dans le mot
      1. Mise en œuvre de la devanâgari : traitement des ligatures
      2. Formes des caractères arabes

  3. Opérations sur les caractères
    1. Classes de caractères
      1. Expressions régulières.
      2. Accès via des classes en Java
    2. Minuscules/Majuscules
    3. Accumulation de signes diacritiques et normalisation des caractères composés
      1. Signes diacritiques et composition
      2. Problème de normalisation
    4. Ordre alphabétique
      1. Remarque préliminaire
      2. UCA : Une base de départ

  4. Conclusion : Progrès irréversible d'Unicode

  1. Informations relatives aux caractères Unicode

    Le consortium Unicode met en ligne une véritable base de données relative aux caractères de son catalogue.
    D'un point de vue conceptuel, on peut considérer que c'est ce modèle de données qui définit la notion de caractère !
    En effet, la nature des propriétés en question ne peut s'expliquer qu'au vu des problèmes qui se posent
    dans la mise en œuvre du standard Unicode.
    Néanmoins, nous essaierons de donner ici une idée de cette base de données avant d'aborder quelques-uns de ces
    problèmes, afin de pouvoir suggérer, pour chacun d'entre eux, la manière dont il est résolu.
    On trouvera dans le chapitre 3 du livre de Y. Haralambous une analyse des propriétés en question,
    plus approfondie que celle de B. Desgraupes.

    L'expression "base de données" est à prendre ici en un sens intuitif et non pas au sens technique
    qu'elle revêt en informatique (avec un SGBD, etc). La taille des données en question (quelques mégaoctets)
    ne rend pas nécessaire de recourir à une technologie lourde, des fichiers texte suffisent (en ASCII pur, bien entendu).
    Nous donnons ici quelques indications sommaires sur l'organisation retenue.
    Pour en avoir plus de détais sur cette organisation, voir le chapitre 2 du livre de Bernard Desgraupes.
  2. L'affichage du texte

    C'est bien entendu la première préoccupation relative aux "caractères d'imprimerie" !
    Au-dela de la production des pixels pour chaque caractère,
    qui relève de la mécanique typographique de la police choisie (voir le cours 3),
    certaines préoccupations relèvent du texte lui-même, ou plus exactement de sa représentation comme fichier
    de caractères (eux-mêmes réalisés comme des octets - par exemple, en UTF-8).

    Nous allons voir qu'Unicode adopte un principe simple, mais dont la mise en œuvre pose quelques problèmes.
    1. Principe : Ordre de lecture

      On considère que le texte affiché (sur l'écran ou par l'imprimante) possède un ordre naturel de lecture.
      Cet ordre "logique" est différent de l'ordre spatial : ce dernier peut être horizontal de gauche à droite,
      ou de droite à gauche, ou dans les deux sens une ligne sur deux (écriture boustrophédon),
      ou encore vertical de haut en bas, et là encore de gauche à droite ou de droite à gauche.
      Plus précisément, dans l'ordre de lecture la voyelle suit la consonne, comme dans "b-a, ba".

      Principe
      : Les caractères Unicode sont rangés dans le fichier dans l'ordre de lecture.

      Corollaire
      : la disposition spatiale du texte affiché est entièrement à la charge du logiciel d'affichage.

      Nous allons examiner à présent trois des questions qui se posent dans ce contexte.
    2. Ordre d'écriture

      • A priori, écrire de droite à gauche n'offre pas plus de difficultés qu'écrire de gauche à droite...
        mais en fait l'ordre gauche-droite s'applique aux chiffres même pour les écritures droite-gauche.
        On n'échappe donc pas à la bidirectionnalité !
        Ce problème est traité par Unicode
        1. en attribuant à chaque caractère une propriété de directionnalité
          (5ème champ dans le fichier UnicodeData.txt)
        2. en spécifiant un algorithme d'affichage bidirectionnel qui exploite ces propriétés,
          dont on trouvera une analyse détaillée chez Haralambous, p. 129 - 141.

      • Exemple (repris du livre de Bernard Desgraupes, p. 165, en le rectifiant et en le complétant) :

        Et Dieu dit "fiat lux" : יהי אור, et la lumière fut : ויהי-אור
        (mieux que
        "et facta est lux" de la Vulgate !)

      • Pour apprécier la subtilité de la chose, réfléchissons par exemple au statut des parenthèses :
        les seules parenthèses présentes en Unicode ont les numéros x0028  (ouvrante) et x0029 (fermante).
        Or, la forme (glyphe) de la parenthèse ouvrante (resp. fermante) n'est pas la même selon qu'on écrit
        de gauche à droite ou de droite à gauche !
        Par conséquent, en Unicode les parenthèses possèdent la propriété dite "miroir bidirectionnel",
        fixée dans le fichier UnicodeData.txt (10ème champ), et le changement de forme lui-même
        est réglé par le fichier annexe BidiMirroring.txt.

      • Illustration : Dans l'exemple précédent, le choix de l'ordre d'affichage des caractères est fait sans erreur
        par le logiciel car les caractères hébraïques sont connus comme s'écrivant de droite à gauche
        (champ n° 5 dans UnicodeData.txt).
        Certains signes de ponctuation, comme la virgule ou le point d'interrogation, sont naturellement orientés
        "de gauche à droite". Il existe donc une virgule spécifique aux écritures de droite à gauche
        (arabic comma, n° 1548, 0x060C) et un point d'interrogation idem.
        Mais d'autres signes, comme le point, n'ont pas d'orientation propre. Il y a "un seul" point dans Unicode.
        Si un point est entouré de caractères "droite-gauche", il sera traité de même.
        Mais un point qui termine une plage "droite-gauche" et qui est suivi par une plage "gauche-droite",
        où faut-il l'écrire ?
        Pour lever cette ambiguïté, en HTML il faut placer le fragment de texte concerné dans une plage
        marquée "droite-gauche" (<span dir="rtl">....</span>).
        À l'intérieur de cette plage, en vertu de la propriété "miroir bidirectionnel", l'interprétation des parenthèses
        est inversée. (démo)

        Et Dieu dit "fiat lux" (יהי אור !) et la lumière fut (ויהי-אור !)
        (mieux que
        "et facta est lux" de la Vulgate !)
    3. Signes diacritiques

      Il n'y a guère de système d'écriture qui se passe entièrement de signes accessoires
      (accents, points, cédilles et autres) posés sur ou sous les caractères majeurs.
      Le traitement de ces signes pose des problèmes qui diffèrent suivant les cas.
      Nous donnons ici au terme "signe diacritique" une acception large, comme on le verra,
      sans nous soucier des divers sens techniques que le mot diacritic peut prendre dans le standard Unicode
      (3 entrées dans l'index du livre de Desgraupes !)

      • Il arrive que ces signes accessoires soient intégrés au caractère principal :
        c'est le cas notamment pour les lettres accentuées du français,
        (et plus généralement des extensions à l'alphabet latin comme le vietnamien),
        ainsi que pour les accents, esprits et iota souscrits du grec polytonique.

        Dans ce cas, la théorie de l'ordre de lecture s'applique sans difficulté pour l'affichage,
        c'est en revanche le logiciel d'acquisition qui a le problème d'engendrer le caractère "complexe"
        à partir de plusieurs frappes consécutives (voyez notre accent circonflexe !).

      • Mais il arrive aussi que les signes diacritiques représentent des entités indépendantes,
        comme les voyelles de l'hébreu ou de l'arabe, ou soient traités comme tels
        (en hébreu, les points distinguant le sin שׂ du shin שׁ,
        en arabe, l'absence de voyelle sûkûn et le signe de redoublement shadda).

        Das ce cas, ces signes apparaissent comme des caractères à part entière,
        mais ils ont des propriétés particulières relative à l'espace qu'ils occupent (non-spacing characters).
        On les qualifie de combinatoires - puisqu'ils se combinent avec d'autres -
        et on leur donne une catégorie (3ème champ dans le fichier UnicodeData.txt)
        dont le nom commence par M (comme "marque") : Mn, Mc ou Me
        selon qu'ils ne prennent point de place, qu'ils en prennent ou qu'ils entourent le caractère principal.

        Précisons que dans l'ordre de lecture - donc dans le fichier - ils viennent après le caractère principal.
        S'il y en a plusieurs, leur accumulation est réglée par un ordre donné par la classe combinatoire
        du caractère principal (3ème champ dans le fichier UnicodeData.txt)
        Voici notre exemple précédent en hébreu dûment vocalisé :

        יְהִי אוֹר; וַיְהִי-אוֹר

      • Notons enfin qu'on passe insensiblement des signes diacritiques, où il y a clairement une hiérarchie
        entre le caractère principal et le caractère annexe, au problème plus général de la combinaison
        des caractères (liaisons, ligatures et autres modifications liées à la position du caractère dans le mot).

    4. Liaisons, ligatures et autres modifications liées à la position du caractère dans le mot

      Nous n'aborderons que deux exemples de ce type de problèmes posés aux logiciels de visualisation :
      les ligatures de l'écriture indienne devanâgari et la forme variable des caractères arabes.
      Les problèmes de la devanâgari se retrouvent mutatis mutandis dans toutes les écritures indiennes (y compris la tibétaine),
      et ceux de l'arabe affectent aussi le syriaque.
      • Mise en œuvre de la devanâgari : traitement des ligatures
        1. Le problème

          • L'écriture devanâgari considère que la voyelle a (bref) est inhérente à chaque consonne.
            Elle ne l'écrit donc pas : le caractère x0915  क  = ka
          • Les autres voyelles en revanche sont écrites : कु = kuको = ko, etc.
            Les caractères de voyelles en question ont le statut de signes diacritiques
            (indiqué dans le 3ème champ du fichier UnicodeData.txt par un libellé commençant par 'M' - comme Mark)
            • le 'u' bref  ' ु ' U+0941 est de la catégorie Mn : 0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;,
              c'est donc un signe qui ne prend point de place (non-spacing character),
              d'où son indifférence au sens d'écriture (dans le champ n° 5 : NSM = Non-Spacing Mark)
            • tandis que le 'o' (toujours long)  ' ो' U+094B est de la catégorie Mc : 094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
              car il occupe clairement autant de place qu'un caractère "normal", et il s'écrit de gauche à droite
            • de même pour le 'i' bref 'ि  ' U+093F : 093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
              qui a pourtant un comportement différent : il vient se placer avant la consonne !
              cette affaire d'importance est confiée au zèle du moteur de rendu...
            • et de même encore en tamoul et en bengali pour des voyelles qui s'écrivent autour (des deux côtés) de la consonne !

          • Mais comment faire si on ne veut pas de voyelle, pour avoir un groupe de 2 ou 3 consonnes ?
            On a alors recours à une ligature, qui peut prendre des formes variées (glyphes), où les caractères composants sont plus ou moins reconnaissables :
            क + व = क्व , क + म = क्म , क + ष  =  क्ष , क + र = क्र
          • On trouve un tableau complet des ligatures binaires sur la Wikipedia anglaise
            (il y en a aussi de ternaires, comme str dans स्त्री  strī = femme, épouse) .
            Mais les formes correspondantes ne figurent pas dans le catalogue Unicode !

          • Comment va-t-on faire ?

        2. La solution

          1. Il existe dans l'alphabet devanâgari une lettre spéciale, le virâma, n° 2381 = x094D, de catégorie Mn
            indiquant l'absence de voyelle.
            Ce caractère appartient à une sous-catégorie Grapheme_Link donnée dans le fichier PropList.txt
            (ce qu'Haralambous p. 114 traduit par gluon de graphème).
            Il s'écrit comme une sorte de virgule souscrite : क्  = k sans voyelle.
          2. Dans l'usage normal, cette lettre n'est employée qu'en fin de mot : महान् mahãn = grand
            (comme dans mahãrãjã et dans mahãtmã).
            Elle apparaît également pour éviter aux typographes des ligatures particulièrement acrobatiques,
            ou pour simplifier la lecture à l'intention des enfants :
            • dans un manuel de hindi pour classes élémentaires on trouve दुपट्‌टा dupaṭṭã = écharpe, avec virâma
            • mais le dictionnaire donne दुपट्टा, avec ligature.

          3. Même si l'emploi du virâma est assez restreint dans l'usage courant,
            il offre la possibilité d'une écriture normalisée sans ligature.

        3. Le choix de réalisation avec Unicode est :
          1. on écrira (dans le fichier) sous forme normalisée, avec virâma
          2. et la réalisation des ligatures sera confiée au logiciel d'affichage.

        4. Il en résulte une exigence très forte à l'égard des éditeurs de texte, des navigateurs, entre autres  !
          Tous ne sont pas également performants...
          Soulignons que le standard Unicode est très discret sur ces ligatures
          (la seule indication étant la qualification du virâma comme gluon de graphème)
          alors même que certaines d'entre elles ont pratiquement acquis le statut de caractères indépendants
          et que leur emploi est quasi-obligatoire (kṣa : क + ष = क्ष, et jña : ज + ञ = ज्ञ).
          D'autre part, il faut reconnaître que le choix est vaste et qu'il est largement affaire de style typographique
          (traditionnaliste, moderniste...) si bien qu'on sort très vite du domaine de compétence du standard.

          Exemple
          : comparez le savoir-faire de différents outils sur le mantra गायत्री (Gâyatrî)
          Comme votre instrument d'observation sera peut-être différent du mien,
          je vous montre les images de ce que je vois sur Mac-OS X.3 :
          • d'abord le contenu du fichier html tel que le révèle TextEdit.
          • le travail impeccable du navigateur Safari,
          • le travail beaucoup moins satisfaisant de Firefox 2 sur Macintosh, qui visiblement n'a pas investi sur ce point,
            contrairement à ses versions sur Windows et sur Linux.
            La nouvelle version de Firefox (3.5.7) a rattrapé ce retard !

        5. Illustrations

          • Il suffit pour se convaincre d'examiner avec un outil révélant les octets des fichiers contenant de la devanâgari  :
            la représentation du virâma en UTF-8 est  <E0><A5><8D>

          • Sachant que = <E0><A4><95> et que  = <E0><A4><B5>
            on trouve bien dans le fichier  क्व = <E0><A4><95><E0><A5><8D><E0><A4><B5>
            etc...

          • Pour obtenir l'absence de ligature dans दुपट‌्टा,
            il a fallu insérer un caractère supplémentaire après le virâma,
            à savoir le n° x200C antiliant sans chasse, alias ZWNJ (Zero-Width Non-Joiner), en UTF-8  : <E2><80><8C>.
            (Merci à Y. Haralambous pour son excellent livre!)
            Il y a donc à cet endroit dans le fichier :
            <E0><A4><A6><E0><A5><81><E0><A4><AA><E0><A4><9F><E0><A5><8D><E2><80><8C><E0><A4><9F><E0><A4><BE>
            et une ligne plus loin, avec un caractère de moins :
            <E0><A4><A6><E0><A5><81><E0><A4><AA><E0><A4><9F><E0><A5><8D><E0><A4><9F><E0><A4><BE>

          • Nombreux exemples dans la page de démonstration "Qu'est-ce qu'Unicode" en hindi.

        6. Démonstration... et difficultés techniques

          • Écrire dans un éditeur comme TextEdit : on voit les ligatures se former à l'écran...

          • Mais aussi problème d'avoir une police qui se prête à ce rendu complexe :
            à ce niveau de complexité les mécaniques de Microsoft (Uniscribe) et d'Apple (ATSUI = Apple Type Services for Unicode Imaging)
            ne sont plus compatibles, et une police valable sous Windows ne fonctionne pas sous MacOS.

          • Pour plus de détails sur les ligatures des écritures indiennes, voir le chapitre 10
            sur le site de Patrick Andriès http://hapax.qc.ca/.
      • Formes des caractères arabes
        1. Rappel : chaque lettre de l'alphabet arabe peut revêtir en principe quatre formes,
          suivant qu'elle isolée, initiale, médiale ou finale.
          Exemple 1 : les quatre formes de la lettre ha (U+0647) :
          • isolée : ه
          • initiale : هـ
          • médiale : ـهـ
          • finale : ـه

          Exemple 2 : les quatre formes de la lettre ayn (U+0639) :
          • isolée : ع
          • initiale : عـ
          • médiale : ـعـ
          • finale : ـع

        2. Dans le répertoire Unicode, il n'y a qu'un code par caractère, et non pas quatre correspondant aux quatre formes.
          Les formes liées sont engendrées par le logiciel de visualisation.
          Pour ce faire, le logiciel est aidé par les informations contenues dans le fichier ArabicShaping.txt,
          qui formalise les "obligations de liaison" pour les écritures arabe et syriaque.

        3. Les caractères sont toujours écrits de gauche à droite dans le fichier, y compris les caractères arabes.
          C'est le logiciel de visualisation qui les affiche de droite à gauche (bidirectional algorithm).
          Notons que la propriété de directionalité (5ème champ dans le fichier UnicodeData.txt)
          prend pour les caractères arabes (et syriaques) la valeur AL (comme Arabic Letter)
          et non R (Right to Left) comme pour les lettres hébraïques.

        4. En UTF-8 les caractères arabes sont codés sur 2 octets (comme les lettres accentuées françaises),
          tandis que les caractères indiens (devanâgari et autres) sont codés sur 3 octets, comme on a pu le voir.

        5. Exemple le texte : &# x0627;&# x0644;&# x0645;&# x064F;&# x0639;&# x064E;&# x0644;&# x0651;&# x064E;&# x0642;&# x064E;&# x0627;&# x062A;
          (À votre avis, pourquoi ces blancs bizarres entre "&#" et "x...." ?)
          qui se transcrit "almu`allaqât" est interprété comme suit par Safari, avec une belle ligature entre lâm et mîm
          et le fatha impeccablement placé au-dessus du shadda qui redouble le second lâm :

          muallaqat-Safari

          et d'une manière différente par Firefox 2, avec un traitement plus fruste de la liaison lâm-mîm et un placement
          moins précis du fatha au-dessus du shadda :
          muallaqat-Firefox

          Ici aussi, la nouvelle version de Firefox (3.5.7) fait un travail beaucoup plus soigné!

          On trouvera de nombreux exemples dans la page de démonstration "Qu'est-ce qu'Unicode" en arabe.
          ainsi que dans une excellente introduction à la littérature arabe (en espagnol).

        6. Adaptation au persan ( فارسی fârsi)
          L'écriture du persan fait appel à cinq lettres supplémentaires,
          le : پ (x067E), le tché : چ (x0686), le : ژ (x0698), et le gaf  گ (x06AF),
          qui suivent les mêmes règles que les lettres arabes dont elles sont dérivées,
          et en position finale un ya sans points : ی (x06CC),
          qu'il ne faut pas confondre aec l'alif maksura de l'arabe : ى (x0649).

          Nombreux exemples dans la page de démonstration "Qu'est-ce qu'Unicode" en persan.
          Pour quelques URL de sites proposant des textes persans, voyez mes notes sur Khayyâm.

        7. Pour plus de détails sur la réalisation des écritures hébraïque, arabe et syriaque, voir le chapitre 9
          sur le site de Patrick Andriès http://hapax.qc.ca/.
  3. Opérations sur les caractères

    Nous abordons ici brièvement des manipulations des textes qui ne sont pas liées à l'affichage.
    Elles sont  nombreuses, mais souvent cachées au regard extérieur.
    Par exemple, dans le domaine administratif, la gestion de listes de noms rangées en ordre alphabétique,
    ou la normalisation de "nom, prénom" en "NOM, Prénom" (avec des majuscules significatives).
    Dans le domaine littéraire, les recherches de fréquence de mots dans des corpus, l'établissement de concordances.
    La possibilité de traiter ce genre de questions d'une manière systématique est sans aucun doute un des grands progrès apportés par Unicode.