mercredi 27 novembre 2013

Problèmes de sens de lecture

Les problèmes d'encodage, c'est un cauchemar quotidien lorsqu'on travaille sur des corpus. Surtout sur des corpus venants du web. Surtout sur des corpus comprenant des systèmes d'écriture non latins.

Mais aujourd'hui, nous avons eu affaire à une nouveauté dans le domaine : les problèmes liés au sens de lecture. Voyez plutôt :

cliquer pour agrandir la capture

Nous avons ici une capture d'écran du résultat d'un script perl qui nous est fourni (minigrep) pour effectuer des recherches de motif avec des systèmes d'écriture divers. L'une de nos langues de travail est l'arabe, langue qui se lit de droite à gauche.

Dans un encodage Unicode, les caractères sont entrés dans l'ordre de lecture, sans tenir compte de la nature de cet ordre. C'est à dire qu'en arabe, où on doit écrire , sitôt qu'on écrit de l'arabe le curseur se déplace de droite à gauche, et on entre d'abord 11, puis le mot. Si on affiche les octets composant le fichier, on observera que les octets correspondant à "11" viendront avant les octets correspondant à "سبتمبر". C'est le rôle du moteur de rendu, ici votre navigateur préféré, d'afficher le texte de droite à gauche.

Il en résulte divers problèmes lorsqu'on mélange de l'arabe avec du français (comme pour rédiger cet article) ou avec du code (comme pour écrire une expression régulière). Dans la rédaction de cet article, j'ai été contrainte d'utiliser une image pour illustrer mon propos dans le paragraphe précédent, la succession d'écritures latine et arabe renvoyant le curseur à droite ou à gauche, mais jamais au bon endroit !

Mais revenons aux problèmes de programmation. Sur la capture, nous avons en haut l'expression régulière soumise à Perl. A la suite, les contextes où la regex a été trouvée. L'ordre change, et pourtant le motif est détecté.

L'inversion peut s'être produite à plusieurs niveaux, mais le plus probable est que le problème vienne tout simplement de l'affichage du fichier html de sortie. Dans l'affichage de la regex, l'arabe se trouve juste à côté de caractères latins. Le "11" a été traité comme faisant partie du texte latin, et a donc été placé à gauche. Dans l'affichage du résultat, on a un bloc de texte arabe, dans lequel les "11" ont été placés au bon endroit. 

Mais pour écrire notre expression régulière, nous avons dû écrire "11" puis le mot signifiant "septembre" pour repérer les occurences de ce qui s'affiche à l'écran comme étant "septembre" puis "11"... si on ignore le sens de lecture.

 Comme quoi, même en tout Unicode, on n'est pas sortis de l'auberge.

Aucun commentaire:

Enregistrer un commentaire