David Madore's WebLog: Une tentative pour écrire un Unicode pour les nuls

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

↓Entry #2591 [older| permalink|newer] / ↓Entrée #2591 [précédente| permalien|suivante] ↓

(mercredi)

Une tentative pour écrire un Unicode pour les nuls

Méta : Le but de cette entrée serait idéalement de dégager une sorte de document que je voudrais appeler Unicode pour les nuls : l'idée serait d'avoir quelque chose de compréhensible par le grand public (disons par tout le monde ayant une connaissance minimale de l'usage d'un ordinateur — savoir faire du copier-coller par exemple) et qui présente les choses que je voudrais que tout le monde sût à propos d'Unicode (ce que c'est, à quoi ça sert, pourquoi ça existe, mais aussi quel impact ça peut avoir sur eux — notamment au niveau sécurité — et comment s'en servir). Évidemment, un tel document n'aurait vraiment de sens que dans le cadre plus général d'une formation aux bases de l'informatique pour le grand public (qui expliquerait, par exemple, dans un de ses chapitres, ce qu'est le Web et l'idée générale d'un navigateur Web, ce qu'est une URL et une page Web, ce genre de choses, pour pouvoir notamment donner des conseils de sécurité), mais je n'ai ni le temps ni la patience d'essayer d'écrire un tel cours, alors je me contente de réfléchir à une toute petite brique, celle concernant Unicode. (Et encore, je vais plutôt décrire ce que j'imagine qu'il faudrait écrire que l'écrire vraiment.) • Pourquoi spécifiquement Unicode ? D'abord parce que je pense que c'est un low-hanging fruit (le grand public a beaucoup à gagner pour peu d'efforts à en savoir un peu sur le sujet) ; mais aussi pour une raison égoïste, qui est que ça m'agace, quand j'interagis avec des gens électroniquement, de me retrouver à lire ou à répondre à des choses comme comment tu fais pour écrire ℝ dans un message sur Twitter ? (enfin, justement, on va plutôt me demander comment je fais pour écrire un R double barre (i.e., gras-tableau-noir) ; et ce qui m'énerve franchement, ce sont les gens qui écrivent |R pour essayer d'imiter ce ), ou bien je ne sais pas taper l'e-dans-l'o, ce n'est pas sur mon clavier, et je ne parle pas de choses comme ça.

Cette entrée ne se veut pas finie, et pose notamment la question aux lecteurs techniquement compétents de ce qu'il faudrait encore y dire, ou comment rendre les choses plus accessibles à Madame Michu et Monsieur Dugenou. (Mais à vrai dire, j'aurai certainement perpétuellement la flemme de compléter ce texte. Comme j'aurai la flemme de simplifier les passages où je me suis entraîné à dire des choses trop compliquées. Je suis quand même intéressé par les retours d'éventuels Madame Michu et Monsieur Dugenou qui tomberaient sur ce texte, pour qu'ils me disent ce qui leur semble pas clair ou à améliorer dedans.)

Bref. Qu'est-ce que je veux faire comprendre au grand public concernant Unicode ? Principalement les passages en gras dans ce qui suit (mais aussi, quand même, ce qui est entre les passages en gras…) :

Premièrement, bien sûr, ce que c'est : Unicode est un standard informatique définissant un jeu de caractères (mais aussi des conventions sur comment gérer ces caractères) permettant de représenter un nombre gigantesque de langues différentes ainsi qu'une masse énorme de symboles variés (dont les fameux emojis qui sont peut-être maintenant ce qui rend Unicode le plus célèbre auprès du grand public). Il faudrait peut-être ajouter ici des exemples de langues gérées par Unicode et de mots écrits dans ces langues, mais disons que quasiment tous les systèmes d'écriture de langues encore vivantes sur Terre et un bon paquet de langues mortes et quelques langues artificielles (whatever that means) sont représentables par Unicode. Quant aux symboles, ils couvrent toutes sortes de pictogrammes courants, de symboles techniques dont un nombre énorme de symboles mathématiques, mais aussi, tout simplement, beaucoup de signes de ponctuation un peu bizarres ou exotiques.

Maintenant, le problème avec cette présentation, c'est que si on dit ça au grand public, il va avoir tendance à penser immédiatement OK, mais ça ne me concerne pas / ne m'intéresse pas, parce qu'il n'a pas spécialement envie de taper du phénicien ; et il y a le problème annexe qu'il risque de s'imaginer qu'Unicode est un truc compliqué et exotique, peut-être une application à installer en plus sur son ordinateur, ou quelque chose de ce genre. En réalité, il faut faire comprendre au grand public qu'il est forcément concerné au moins pour la raison idiote que dès lors qu'il tape bonjour sur son clavier, ce sont des caractères Unicode (ni plus ni moins que здравствуйте ou أَلسَّلَامُ عَلَيْكُمْ ou 你好 ou नमस्ते ou encore 😃🤝❣️ — que vous voyez peut-être, ou peut-être pas, comme des lettres cyrilliques, des lettres arabes, des idéogrammes chinois, des lettres devanāgarī et des emojis).

Il y aurait peut-être lieu de faire un petit historique et de rappeler qu'à une époque reculée où la lumière d'Unicode ne baignait pas le monde informatique, à cause de limitations sur le nombre de caractères qu'on s'autorisait à prendre, il y avait toutes sortes de jeux de caractères différents : un tel pour l'alphabet latin utilisé par les langues de l'ouest de l'Europe, un autre pour l'alphabet latin des langues de l'est de l'Europe, un pour l'alphabet cyrillique (plusieurs, en fait), et ainsi de suite. Un vrai chaos, dans lequel un document texte risquait sans cesse d'être mal interprété (voir par exemple cette photo d'une carte postale manuscrite dans lequel le nom de la ville russe d'Екатеринбург [Ekaterinburg] se transforme en l'incompréhensible Åêàòåðèíáóðã parce que les jeux de caractères CP1252 et CP1251 ont été confondus), et on ne pouvait pas mélanger des bouts de langues trop différentes dans un même document. Ce n'est pas pour dire que ce genre de confusions n'arrive plus du tout, mais disons que les problèmes ont été sérieusement circonscrits, et en tout cas on peut mélanger sans problème plusieurs langues dans un même texte (y compris le mot russe Екатеринбург et le charabia Åêàòåðèíáóðã), cette page Web en étant la preuve. Mais je ne suis pas sûr que le grand public soit tellement intéressé par les considérations historiques de ce genre. Ça vaut peut-être tout de même la peine de signaler qu'essentiellement tous les jeux de caractères qui préexistaient à Unicode ont été absorbés dans celui-ci, c'est-à-dire que tous leurs caractères font partie d'Unicode (ce qui est parfois malheureux parce que cela donne toutes sortes de caractères dont on ne voudrait pas forcément, par exemple un symbole micro ‘µ’ différent de la lettre mu ‘μ’ — voir plus bas au sujet des caractères visuellement indiscernables).

En revanche, ce que je crois important de souligner, c'est que de nos jours, Unicode est partout : dans l'immense majorité des situations où un ordinateur manipule des chaînes de caractères (i.e., du texte), ces caractères sont des caractères Unicode. Les pages Web sont en Unicode ; les adresses des pages Web sont (ou au moins, peuvent être) en Unicode ; les mails sont en Unicode (pour les adresses mail, c'est plus discutable) ; les documents Word ou LibreOffice sont en Unicode ; les recherches Google / Bing / DuckDuckGo / etc. sont faites en Unicode ; Wikipédia est en Unicode ; les tweets sont en Unicode ; même les SMS sont en Unicode (même s'il y a là quelques subtilités qui font que tous les caractères ne se valent pas) ; sur beaucoup de systèmes d'exploitation, les noms de fichiers sont en Unicode ; et ainsi de suite. (Il y a bien sûr des exceptions : les compagnies aériennes n'utilisent certainement pas Unicode dans leur système de réservation antédiluvien, et si votre nom comporte des caractères bizarres, vous le savez certainement au moment d'essayer de prendre un billet.)

Le grand succès d'Unicode, c'est l'interopérabilité : dès lors que tout le monde est d'accord sur ce qu'est un caractère (en refilant l'embarras de la décision à Unicode), on peut considérer que la notion de chaîne de caractères est actée à travers l'informatique, et on peut échanger cette donnée sans trop se poser de questions.

Et par voie de conséquence, dans chacun des cas évoqués plus haut, si vous pouvez utiliser des mots de l'alphabet latin comme bonjour (et certainement si vous pouvez utiliser des emojis), vous pouvez aussi utiliser, ou au moins essayer d'utiliser, toutes sortes d'autres caractères, notamment toutes sortes d'autres écritures. (Par exemple, aucun besoin de passer par « Google Inde » pour chercher नमस्ते dans Google.) Je vais revenir plus loin sur la question de comment on peut saisir ces caractères (si on ne les a pas sur le clavier…), mais je réponds là implicitement à des gens qui s'étonnaient que je puisse utiliser des caractères mathématiques comme ℝ dans mes tweets ou même dans des SMS. Ce sont des caractères Unicode comme les autres, c'est vraiment ça la beauté du système.

Bien sûr, je ne prétends pas que tous les caractères Unicode seront acceptés partout : il peut y avoir plein de raisons d'en interdire certains ou d'en limiter d'autres, ou de ne pas les traiter également. Mais normalement, ce genre de limitations est fait pour des raisons de sécurité ou parce que les caractères sont utilisés pour un sens précis (par exemple, si le caractère ‘/’ est utilisé pour séparer les répertoires dans les noms de fichier, il ne peut pas servir à l'intérieur d'un nom de fichier, vous voyez l'idée) : ce sont donc plutôt des exclusions au cas par cas que le contraire.

Et ce qui est peut-être le plus important : le copier-coller de texte est en Unicode sur tous les systèmes informatiques modernes, ce qui permet de prendre des caractères Unicode d'un endroit (même si on ne sait pas les taper/saisir) et de les reproduire à un autre endroit. Ceci permet déjà au moins de faire des recherches Web de termes de langues exotiques même si on ne sait pas écrire les langues en question, c'est déjà quelque chose d'important à comprendre. (Bon, il faut quand même signaler qu'il arrive que le copier-coller fasse toutes sortes de modifications subreptices sur le texte qu'on copie-colle et cause ainsi des complications, mais c'est au moins un point de départ.) De même, pour ceux qui me demandent comment ils peuvent envoyer un ℝ par SMS, ils peuvent au moins le faire en sélectionnant ce ℝ depuis cette page-ci consultée sur leur mobile, en utilisant copier pour enregistrer le caractère en question dans le presse-papier, et en faisant coller pour mettre le caractère dans un SMS. Il y a possiblement plus simple, mais il est bon d'avoir ce genre de solution en tête (ça me semble tellement évident que j'ai du mal à concevoir qu'on puisse ne pas y penser, mais j'ai observé que tout le monde n'y pense pas forcément, donc je préfère enfoncer les portes ouvertes).

Bon, maintenant, essayons d'être un peu plus précis. Quelques choses que je pense qu'il faut savoir sur les caractères Unicode :

  • Chaque caractère Unicode a un numéro et un nom : le numéro est écrit en hexadécimal [là, il faudrait en dire un minimum sur ce qu'est l'hexadécimal si Monsieur Dugenou ne connaît pas, au moins pour lui dire que ce n'est pas vraiment important d'en savoir plus mais que ça s'écrit avec les chiffres de 0 à 9 et les lettres de A à F] sous la forme U+NNNN avec quatre ou cinq chiffres hexadécimaux N, et le nom est, par convention, écrit entièrement en majuscules : il donne quelque idée sur ce que le caractère représente, même s'il ne faut pas le prendre pour une définition. Le numéro seul ou le nom seul suffisent à identifier un caractère Unicode de façon unique, mais souvent, on écrit quand même les deux l'un à la suite de l'autre. Par exemple, ‘A’ est U+0041 LATIN CAPITAL LETTER A tandis que ‘😃’ est U+1F603 SMILING FACE WITH OPEN MOUTH.
  • Les tables de caractères complètes sont disponibles ici sur le site du Consortium Unicode (il s'agit d'autant de liens vers des tableaux PDF donnant les numéros et noms des caractères ainsi que parfois quelques explications minimales et un glyphe de référence). Je pense que c'est intéressant à parcourir ne serait-ce que pour se faire une idée de la variété de ce qui existe dans Unicode.
  • Deux caractères Unicode différents peuvent apparaître visuellement identiques (j'avais fait toute une entrée sur cette question, je ne vais pas redire tout ça ici). Par exemple, les premières lettres des alphabets latin, grec et cyrillique sont respectivement ‘A’ (U+0041 LATIN CAPITAL LETTER A), ‘Α’ (U+0391 GREEK CAPITAL LETTER ALPHA) et ‘А’ (U+0410 CYRILLIC CAPITAL LETTER A), et il est probable que vous voyiez à peu près voire exactement la même chose, ce qui n'empêche que ce sont des caractères bien différents que l'ordinateur ne confond pas (on peut s'en convaincre, par exemple, en faisant des recherches Google de ces trois chaînes). Cette confusion visuelle, bien sûr, présente toutes sortes de dangers. Plus généralement, la question de savoir si deux caractères devraient être ou ne pas être le même est épineuse, Unicode a dû trancher quantité de jugements de Salomon et il y aura forcément des choses dont on sera mécontent (cf. l'entrée vers laquelle je viens de faire un lien).
  • Le même caractère n'apparaît pas forcément de la même manière chez tout le monde : cela dépend, évidemment, des polices de caractères installées et d'autres facteurs sur le système. En général, ce n'est pas trop problématique, mais concernant les emojis par exemple, on s'est rendu compte que selon le dessin précis utilisé, l'interprétation faite de l'émotion représentée par les emojis pouvait différer de façon importante, causant parfois des malentendus : divers efforts sont faits pour atténuer ce problème, mais il faut garder à l'esprit qu'il existe et, quand on communique, que la personne à qui on écrit ne voit pas forcément la même chose que nous.
  • En particulier, bien sûr, des caractères peuvent manquer, car personne n'a de quoi afficher tous les caractères Unicode. Par exemple, si j'écris ‘𐇑’ (U+101D1 PHAISTOS DISC SIGN PLUMED HEAD), un caractère représentant un symbole du disque de Phaistos (une tête portant une crête ou peut-être un casque à plumes/crête), le caractère s'affiche dans mon navigateur parce que j'ai installé plein de polices, mais je pense que beaucoup de gens ne verront rien. Ne rien voir peut d'ailleurs se manifester de plusieurs manières : caractère simplement absent, carré blanc ou ou gris ou pointillé, dessin spécial marquant un caractère manquant (typiquement un point d'interrogation dans un carré ou dans un losange), ou parfois un dessin spécial montrant au moins le numéro du caractère qu'on ne sait pas afficher (c'est tout de même le mieux !).
  • Un caractère Unicode ne correspond pas forcément exactement à ce qu'on imagine comme un caractère graphique (pour cette raison, il est parfois utile de lever l'ambiguïté en parlant de codepoint Unicode — c'est un anglicisme mais peu importe — et de glyphe pour une unité d'écriture) : par exemple, l'emoji du drapeau français, ‘🇫🇷’ apparaît comme un seul caractère (« glyphe ») mais est en réalité constitué de deux caractères (« codepoints ») Unicode spéciaux consécutifs, à savoir U+1F1EB REGIONAL INDICATOR SYMBOL LETTER F et U+1F1F7 REGIONAL INDICATOR SYMBOL LETTER R, qui n'ont séparément guère de signification mais se « combinent » pour former le drapeau français.
  • …Le fait que deux caractères puissent ainsi se « combiner » est très fréquent dans les systèmes d'écriture un peu complexes. Par exemple, les lettres devanāgarī ‘क’ et ‘ष’ (représentant en gros les sons /ka/ et /ʃa/) sont représentées par les deux caractères Unicode U+0915 DEVANAGARI LETTER KA et U+0937 DEVANAGARI LETTER SSA, mais si on les juxtapose (avec entre elles un caractère servant à supprimer la voyelle /a/), on obtient un glyphe unique ‘क्ष’ (vous devriez voir un unique symbole, représentant en gros le son /kʃa/) qu'Unicode représente comme la succession de codepoints U+0915 DEVANAGARI LETTER KA + U+094D DEVANAGARI SIGN VIRAMA + U+0937 DEVANAGARI LETTER SSA. (Il est néanmoins possible d'inhiber ce genre de comportements et d'écrire par exemple ‘क्‍ष’ en séparant les deux caractères, grâce au ZWJ dont il serait bon de parler aussi.)
  • Un caractère Unicode peut être « combinant », c'est-à-dire qu'il vient modifier le caractère qui le précède, typiquement pour ajouter un accent ou autre diacritique dessus ou dessous (ou même autour). C'est le cas du U+0301 COMBINING ACUTE ACCENT qui vient frapper la lettre précédente d'un accent aigu, par exemple si j'écris ‘x́’ soit U+0078 LATIN SMALL LETTER X + U+0301 COMBINING ACUTE ACCENT, vous devriez voir un ‘x’ accent aigu (même si je ne crois pas que cette combinaison serve dans une langue quelconque). Néanmoins, certains caractères sont « précombinés », par exemple ‘é’ (U+00E9 LATIN SMALL LETTER E WITH ACUTE) est un ‘e’ accent aigu : la différence avec la séquence ‘é’ (U+0065 LATIN SMALL LETTER E + U+0301 COMBINING ACUTE ACCENT) est possiblement problématique, et Unicode a des mécanismes dits de normalisation qui vont convertir l'une en l'autre.
  • Certains caractères sont invisibles ou ont un effet spécial : certains caractères sont prévus pour ne pas s'afficher du tout, mais représentent néanmoins une information ; par exemple, le caractère U+2062 INVISIBLE TIMES marque une multiplication non écrite (i.e., le produit ab de deux quantités a et b, sans symbole entre les deux, pourrait se représenter en Unicode comme U+0061 LATIN SMALL LETTER A + U+2062 INVISIBLE TIMES + U+0062 LATIN SMALL LETTER B), et c'est le principe même de ce caractère que de ne pas apparaître du tout, mais il pourait aider un traitement automatisé ou un synthétiseur vocal à comprendre ça comme un produit et pas comme un mot ou identifiant ab. Il y a toutes sortes de caractères de la sorte dans Unicode. D'autres, en plus de ne pas être directement visibles, ont un effet spécial (comme interdire la césure en ce point, ou l'autoriser, ou empêcher la combinaison de caractères, ou forcer une apparence spéciale, ou changer la direction d'écriture). Voyez par exemple ce fil Twitter où j'évoque quelques usages spécifiques à Twitter possibles du caractère plus-ou-moins-invisible U+200C ZERO WIDTH NON-JOINER ou ZWNJ (et ici de son copain U+2060 WORD JOINER).
  • Il y aurait tout un tas de choses à dire sur la direction d'écriture, qui peut être de gauche à droite ou de droite à gauche et sur les nombreux caractères spéciaux qui forcent l'une ou l'autre direction (avec des effets secondaires divers et variés), mais je pense que ce serait trop long pour rentrer ici dans ces considérations. (Disons tout de même que même si la plupart des caractères d'un vrai système d'écriture ont une directionnalité naturelle, par exemple l'alphabet latin veut aller de la gauche vers la droite et l'alphabet arabe de la droite vers la gauche, mais certains sont « neutres » comme beaucoup de signes de ponctuation, d'ailleurs certains comme les parenthèses ouvrante et fermante ont deux formes miroir selon le sens d'écriture ; par ailleurs, on peut forcer l'écriture dans un sens ou dans l'autre avec des caractères spéciaux, y compris écrire de la droite vers la gauche en alphabet latin ; ceci peut poser toutes sorte de problèmes et ces caractères spéciaux sont souvent interdits — par exemple, Twitter tente de les filtrer, mais ne le fait qu'imparfaitement.)
  • Un caractère Unicode ne spécifie pas la police ou autres attributs de style d'écriture (graisse, inclinaison, couleur, que sais-je encore) : un ‘R’ est un U+0052 LATIN CAPITAL LETTER R, qu'il soit gras (‘R’), italique (‘R’) ou rouge (‘R’) : ce n'est pas le boulot d'Unicode de faire de la typographie (en HTML, et notamment dans ce paragraphe, ça se fait avec des balises spéciales). Notamment, les premières lettres du présent paragraphe sont des caractères latins normaux (le premier est un ‘U’, U+0055 LATIN CAPITAL LETTER U, par exemple). Mais ce principe de non-typographie a lui-même des limites. Par exemple, il y a dans Unicode des alphabets spéciaux qui spécifient une police bien particulière, par exemple ‘𝐑’ est un U+1D411 MATHEMATICAL BOLD CAPITAL R qui doit apparaître à peu près identique à un ‘R’ gras (‘R’), et de même ‘𝑅’ est un U+1D445 MATHEMATICAL ITALIC CAPITAL R qui doit apparaître à peu près identique à un ‘R’ italique (‘R’) : ces alphabets ne sont pas des alphabets, ce ne sont pas des lettres à proprement parler, ce sont des jeux de symboles mathématiques, parce qu'en mathématiques un ‘R’ gras et un ‘R’ italique peuvent avoir un sens complètement différent (pour ne pas parler du ‘R’ gras-tableau-noir ‘ℝ’ ou U+211D DOUBLE-STRUCK CAPITAL R). Évidemment, le fait qu'il ne s'agisse pas de lettre n'empêche pas plein de gens d'en faire usage, par exemple sur Twitter vu que Twitter n'offre aucun mécanisme pour faire du gras, de l'italique ou quoi que ce soit de genre (par exemple : 𝒰𝓃𝒾𝒸ℴ𝒹ℯ ressemble beaucoup à Unicode écrit en police cursive — mais en fait si on cherche Unicode dans cette page, cette occurrence n'apparaîtra pas parce qu'il s'agit de ces symboles mathématiques). De même, certains emoji spécifient une couleur bien particulière et violent donc l'idée que les caractères Unicode sont indépendants de leur couleur d'affichage.
  • Certains caractères ont une double nature, emoji ou non-emoji. Par exemple, ‘☠’ U+2620 SKULL AND CROSSBONES représente une tête de mort au-dessus de deux tibias (fémurs ?) croisés et peut exister soit sous forme d'un caractère « texte » ‘☠︎’, soit sous forme d'un emoji ‘☠️’ (si vous ne voyez pas de différence, l'idée est que le premier doit pouvoir passer pour un symbole quelconque, tandis que le second peut être en couleur et a le même style graphique que l'ensemble des emojis) ; la sélection de l'une ou de l'autre forme se fait par l'addition d'un des caractères U+FE0E VARIATION SELECTOR-15 (pour la forme texte) ou U+FE0F VARIATION SELECTOR-16 (pour la forme emoji) : voir cette liste pour les cas possibles. Si on ne met ni l'un ni l'autre, je ne sais pas bien ce qui est censé se produire (mais l'interface Web de Twitter privilégie la forme emoji).

On pourrait ajouter encore quelques choses sur les encodages d'Unicode, la différence entre UTF-8 et UTF-16 et les gags liés au surrogates (qui ne sont pas des caractères Unicode mais servent à en encoder d'autres dans l'encodage UTF-16, et sont parfois pris par erreur pour des caractères ce qui cause des gags divers et variés), mais ce n'est pas évident à faire sans devenir vite trop technique. Idem pour ce qui est des formes de normalisation et d'équivalence (qui, honnêtement, n'ont pas des masses d'importance dans l'usage quotidien d'Unicode — en tout cas, ce n'est pas ce que j'ai le plus envie d'expliquer à Madame Michu).

Il y aurait sans doute des choses à dire sur un certain nombre de caractères individuels, ne serait-ce que pour le traitement bizarre que certains programmes leur réservent. Par exemple on pourrait évoquer le cas de l'apostrophe droite (', U+0027 APOSTROPHE) qui se transforme parfois par magie en apostrophe courbe (, U+2019 RIGHT SINGLE QUOTATION MARK). Ou la très utile espace insécable (U+00A0 NO-BREAK SPACE) que Firefox a désagréablement tendance à faire disparaître pour des raisons absolument stupides, merde à la fin. Ou les deux copains que sont le ZWNJ (U+200C ZERO WIDTH NON-JOINER) et le ZWJ (U+200D ZERO WIDTH JOINER) (voir ce fil Twitter que j'ai déjà lié ci-dessus, ou encore cette vidéo explicative).

Peut-être même qu'il faudrait faire une petite liste des bugs les plus fréquemment rencontrés en lien avec Unicode (même s'ils sont souvent plutôt liés à des interactions avec des systèmes ou programmes qui continuent à utiliser des jeux de caractères pré-Unicode, comme la fameuse séquence é qui apparaît quand un é encodé Unicode/UTF-8 est interprété à tort en Latin-1/ISO-8859-1, voir notamment cette entrée passée).

Et bien sûr, il faut évoquer les problèmes de sécurité liés à la confusion possible entre caractères Unicode visuellement indiscernables : par exemple que si quelqu'un vous persuade de copier-coller quelque chose comme gооgle.com ça peut être un piège parce que vous n'avez pas remarqué que c'était un ‘о’ cyrillique (U+043E CYRILLIC SMALL LETTER O) et qu'il ne s'agit donc pas de google.com même si ça y ressemble beaucoup. (Bon, sur ce point précis, d'une part l'adresse appartient quand même à Google parce qu'ils l'ont récupérée aussi, et d'autre part le navigateur affichera sans doute xn--ggle-55da.com et pas gооgle.com dans la barre d'adresse, donc il n'y a pas de problème, mais ce type d'attaques peut se décliner à l'infini.)

Peut-être qu'on pourrait dire quelque chose sur les manques et limitations d'Unicode : au niveau des manques, il y en aura toujours, des écritures ou des symboles qui n'ont pas encore été, ne seront jamais, ou ne pourront pas être, encodées. (Citons les hiéroglyphes maya, notamment par manque d'experts prêts à passer un temps invraisemblable sur un boulot de normalisation que les linguistes et archéologues ne considèrent pas assez valorisant ; citons les langues inventées par Tolkien dont il n'est pas clair qu'elles aient leur place dans Unicode, ou le klingon qui ne l'a probablement pas ; citons toutes sortes de logos ou de caractères faisant l'objet d'une marque déposée, comme la pomme d'Apple, qui ne peuvent donc pas être mis dans Unicode.) Pour certains de ces manques, il y a les plages « à usage privé » dont la signification n'est pas définie mais qui dépendent, du coup, de la police de caractères qu'on utilise et qui peuvent servir à afficher tout et n'importe quoi selon ce que la police veut bien y mettre (mais on perd l'interopérabilité). Pour les limitations, on peut évoquer le problème des emojis, qui est un bourbier dont on ne sait pas comment se tirer : les utilisateurs en veulent toujours plus, mais en même temps se mécontentent du fait d'en avoir trop et de la complication à les sélectionner, et le choix de ce qui doit ou ne doit pas être encodé devient perpétuellement plus arbitraire et un peu futile (et part dans des directions pénibles à gérer de considérations politiques et de politiquement correct).

Mais ce qui me manque surtout, c'est des outils à signaler à Madame Michu et Monsieur Dugenou pour faire les deux opérations que je considère comme absolument essentielles :

  • saisir des caractères Unicode par leur numéro ou par leur nom, ou simplement parcourir commodément les noms disponibles (et faire des recherches dedans), et, inversement,
  • décoder des chaînes de caractères Unicode (pour savoir ce qu'il y a dedans), c'est-à-dire convertir une suite de caractères comme bоnjοur ❣︎ en U+0062 LATIN SMALL LETTER B + U+043E CYRILLIC SMALL LETTER O + U+006E LATIN SMALL LETTER N + U+006A LATIN SMALL LETTER J + U+03BF GREEK SMALL LETTER OMICRON + U+0075 LATIN SMALL LETTER U + U+0072 LATIN SMALL LETTER R + U+00A0 NO-BREAK SPACE + U+2763 HEAVY HEART EXCLAMATION MARK ORNAMENT + U+FE0E VARIATION SELECTOR-15.

Ces deux opérations me paraissent essentielles, même pour un utilisateur non technique, pour pouvoir pleinement profiter d'Unicode : la première permet de saisir n'importe quel caractère, et la seconde permet de comprendre ce qu'on voit (et de vérifier l'absence d'éventuels caractères cachés ou déguisés en d'autres ; par exemple, dans ce tweet signalé ci-dessus, il y a beaucoup de caractères cachés dans le dernier mot, et c'est important de pouvoir enquêter si on le souhaite).

Malheureusement, je ne sais pas bien quoi proposer à Madame Michu et Monsieur Dugenou.

  • Comme on me le fait remarquer en commentaire, la page Wikipédia Unicode input a un certain nombre d'informations générales (au moins sur le premier point, i.e., la saisie).
  • Sous GNU/Linux, l'application gucharmap n'est pas mauvaise pour le premier cas d'usage (rechercher et saisir des caractères Unicode par leur numéro ou leur nom).
  • Toujours sous GNU/Linux, ou plus exactement sous Gnome/GTK+, on peut (dans beaucoup d'applications) taper Control-Shift-U suivi d'un numéro hexadécimal, et terminer par une espace, pour entrer directement un caractère Unicode par son numéro.
  • Même si ce n'est pas vraiment le sujet, en matière de saisie, il faudrait encore que je disse quelques mots de la merveilleuse touche Compose qui permet de saisir toutes sortes de caractères (très loin de tout Unicode, mais tout de même de larges bouts du bloc latin) de façon plus commode que par numéro, sans avoir à ce que ces caractères « soient sur le clavier ». C'est comme ça que je saisis, personnellement, les caractères accentués du français (pour taper un ‘é’, par exemple, je tape Compose+apostrophe+e).
  • Pour ce qui est de décoder, sous GNU/Linux, personnellement, j'utilise ce petit script Perl écrit il y a longtemps : il est primitif et moche (et a un certain nombre de défauts), mais je ne connais pas vraiment mieux. On me signale l'existence d'un programme unicode un peu plus standard et qui fait ce genre de choses, mais il n'est pas vraiment commode d'usage (il n'a pas l'air de savoir juste décoder l'entrée standard, ce qui est franchement con). Voir aussi plusieurs scripts qui ont été postés en commentaires. Dans tous les cas, ce n'est pas vraiment pratique pour les utilisateurs novices qui voudraient juste se familiariser un peu avec Unicode !
  • Sous Android, j'ai écrit une application UnicodeMap (peut-être encore disponible sur le Play Store et certainement sur F-Droid) qui permet de façon très primitive de saisir des caractères (via le copier-coller) et aussi de décoder. C'est extrêmement malcommode, malheureusement, et il s'agit d'une vieille version d'Unicode. Je serais prêt à mettre à jour, mais Google change ses API Android tous les trois jours, je suis très las de ce petit jeu, et je n'ai pas envie d'apprendre à recomprendre comment il faut compiler une application Android ni comment la mettre à jour pour que le Play Store en veuille bien. Bref, si vous êtes intéressés par une nouvelle version, le source est ici, faites les changements que vous voudrez et surtout, expliquez-moi comment je dois compiler et tester ce truc parce que je ne sais plus du tout.
  • Toujours pour Android, comme on me le fait remarquer en commentaire, l'application UnicodePad de Ryosuke839 (disponible sur Play Store et F-Droid, ou par le code source ici) est de tout point de vue meilleure que la mienne.
  • Je ne sais vraiment rien de ce qu'on peut faire sur les autres OS (Windows et Mac OS notamment). Autrefois, sous Windows, on pouvait saisir un caractère en tapant Alt et son numéro de caractère… mais c'était le numéro de caractère dans l'archaïque jeu CP437 ; puis ils ont introduit la possibilité de préfixer le numéro de caractère par un zéro… mais c'était alors le numéro dans le jeu CP1252 : comme ça fait plus de vingt ans que je n'ai pas utilisé un Windows, je ne sais pas s'ils ont enfin mis en place un troisième mécanisme avec le numéro Unicode (bon, plusieurs personnes m'ont signalé l'existence d'un raccourci Alt-X, qui marche sur certains programmes dont Wordpad, pour transformer un numéro hexadécimal en caractère Unicode).
  • Il existe différents sites Web permettant de faire au moins un bout des opérations ci-dessus mais ils ont l'air vraiment merdiques. On me signale cependant typeit dans les commentaires, qui a effectivement l'air moins merdique que les autres.

↑Entry #2591 [older| permalink|newer] / ↑Entrée #2591 [précédente| permalien|suivante] ↑

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées