Je suis en train d'essayer d'écrire un script qui a besoin de reconnaître correctement des mots en français, et donc les caractères accentués et autres.
J'ai vu qu'il fallait utiliser la directive locale pour que Perl gère correctement cela, mais j'ai beau essayer, ça ne marche pas.
À ce sujet, j'ai consulté la page de perldoc, qui indique plusieurs prérequis pour l'utilisation de locale :
- Le système d'exploitation (dans mon cas, Ubuntu 7.04) doit supporter le système de "locale" :
Il est mentionné que, si c'est le cas, la fonction setlocale() doit être mentionnée dans la documentation de la bibliothèque C. Je ne sais pas où se trouve cette dernière, donc je suis bien en peine de vérifier, mais je pense que ça doit être le cas, vu que toutes les applications que j'ai installées gèrent correctement la localisation.
- Les définitions des "locale" que je veux utiliser doivent être installées :
Je pense que c'est ce que j'obtiens en tapant "locale -a". Si c'est bien ça, c'est bon, j'ai ce qu'il me faut.
- Perl doit savoir que le système de "locale" est supporté :
J'ai fait comme indiqué, "perl -V:d_setlocale", et pas de souci, "define", ça roule (en plus, ça répond peut-être à mes doutes sur le premier prérequis, je ne sais pas).
- Les variables d'environnement qui déterminent le "locale" doivent être correctement positionnées :
en tapant "locale" tout court, j'obtiens ça :
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
J'en conclue que tout est ok, vu que c'est bien "fr_FR.UTF-8" que je veux utiliser.
- L'application doit positionner son propre "locale" :
Je ne suis pas sûr d'être concerné par ça, vu que c'est bien le "locale" par défaut que je veux utiliser. Donc, "use local;" devrait suffire, si j'ai bien compris (en me basant entre autres sur ce que j'ai pu voir sur ce forum).
Bref, sauf erreur de ma part, toutes les conditions sont réunies. Pour m'en assurer, j'ai réalisé un petit script qui demande de taper une chaîne, et qui la découpe en ses différents éléments, considérant 1) les mots, et 2) tout le reste (caractère par caractère dans ce cas), et qui les affiche sur des lignes différentes.
Voici ledit script :
Voici maintenant ce que donne une exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #! /usr/bin/perl use strict; use warnings; use locale; #fonction de découpage de texte sub coupe { my ($texte)=@_; # utilisation dans un contexte de liste d'une regex avec /g, récupérant # soit des mots (\w+) soit des caractères n'appartenant pas à des mots. my @elements=$texte=~/\w+|./g; @elements; } # prompt et entrée de la chaîne print "Entrez la chaîne à traiter (vide pour sortir) : "; chomp(my $chaine=<STDIN>); while($chaine ne "") { #constitution de la liste avec &coupe my @liste=&coupe($chaine); print "Résultat du découpage :\n"; #affichage du résultat print ((join "\n",@liste)."\n\n"); # prompt et entrée de la chaîne print "Entrez la chaîne à traiter (vide pour sortir) : "; chomp($chaine=<STDIN>); }
Entrez la chaîne à traiter (vide pour sortir) : salut, toi
Résultat du découpage :
salut
,
toi
Entrez la chaîne à traiter (vide pour sortir) : vérification
Résultat du découpage :
v
�
rification
Entrez la chaîne à traiter (vide pour sortir) :
Comme vous pouvez le voir, ce script fait exactement ce que j'attends de lui tant qu'on reste dans le domaine de l'ascii, mais débloque dès qu'on en sort.
Qu'ai-je oublié ? Où ai-je fait erreur ? Que me manque-t-il pour que ça marche ? J'ai beau chercher, je ne vois pas.
Partager