Les Allergies
Alimentaires
Posez votre question Signaler

Perl Tk encodage arabe [Résolu]

dmganges 102Messages postés 29 octobre 2008Date d'inscription 4 décembre 2011Dernière intervention - Dernière réponse le 27 mars 2011 à 08:04
Bonjour,
Je désire "simplement" afficher du texte en langue arabe dans un Widget Label (-textvariable) :
$Wm->Label(
-textvariable => \$Message,
-background => "#FFE0D0",
-relief => "groove",
)->pack( qw / -side bottom -fill x -expand 0/ );
Ce texte se trouve dans un fichier .txt.
Lorsque je visualise le contenu du fichier avec KWrite, et si je choisi dans [encodage] : Unicode (uft16) , je vois bien le texte en arabe.
NB avec Unicode (uft16) , Unicode (ucs2) et Unicode (iso-10646-ucs-2) sont automatiquement cochés.
J'ai bien vu qu'il existe un bon nombre de 'use Encode::Arabic' ... sous CPAM,
mais je ne maitrise pas suffisamment l'anglais pour comprendre les dépendances...
D'avance je vous remercie pour votre aide, tout début de piste sera précieux pour moi car je sèche :-)
QQ info système :
# uname -a
Linux localhost 2.6.22.9-desktop-1mdv #1 SMP Thu Sep 27 04:07:04 CEST 2007 i686 Intel(R) Pentium(R) D CPU 3.00GHz GNU/Linux
# kded --version
Qt: 3.3.8
KDE: 3.5.9
KDE Daemon: $Id: kded.cpp 711061 2007-09-11 09:42:51Z tpatzig $
# perl -v
This is perl 5, version 12, subversion 2 (v5.12.2) built for i686-linux-thread-multi
# perl -MTk -e 'print $Tk::VERSION."\n"'
804.029
Lire la suite 

Perl Tk encodage arabe »

19 réponses
Réponse
+0
moins plus
Aller un petit UP, car ce n'est pas évident !
MERCI
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Si le fichier n'est pas confidentiel tu peux le mettre sur cjoint.
Je vais regarder plus tard.
Ajouter un commentaire
Réponse
+0
moins plus
Bonsoir lami20j,

J'étais absent c'est aprem, là je suis un peu HS,
je prépare çà pour demain matin, à l'heure des poules...

Merci, et content que tu t'intéresses à mon pb.
Ajouter un commentaire
Réponse
+0
moins plus
Pour info, le pgm est une aide à l'apprentissage de la langue arabe.
Ce pgm doit afficher une courte phrase en arabe et "jouer" un fichier mp3 en même temps. La partie mp3 est bien avancée, même OK en Linux ! J'afficherai tout çà ici, il n'y à rien de secret au contraire !

- Le texte arabe se trouvera dans des fichiers.

J'ai trouvé ceci :
http://www.perlmonks.org/?node_id=678525

#!/usr/bin/perl
use warnings;
use strict;
use Tk;
use utf8;
use encoding 'cp1256';
use Encode qw(encode decode);

my $mw = tkinit;

my $menubar = $mw->Menu(-type => 'menubar');
$mw->configure(-menu => $menubar);

my $text1 = encode( 'utf8','ãáÝ'); #arabic word for file
my $text2 = encode( 'utf8','ÝÊÍ'); # arabic word for open
my $text3 = encode( 'utf8','ÊÓÌíá'); # arabic word for save

my $menu = $menubar->cascade(-label => $text1);
$menu->command(-label => $text2);
$menu->command(-label => $text3);

MainLoop;

INCONVENIENTS :
il faut donner des chaines en phonétique, mais ça permet de tester :
- Sur PX ça semble correct, les caractères arabes sont correctement liés.
- Sur Linux les caractères ne sont pas liés, et sont donc présentés sous la forme isolée.

J'ai trouvé également :
http://search.cpan.org/dist/Encode-Arabic/lib/Encode/Arabic.pm

J'ai installé le module, uniquement sur Linux pour l'instant.
Je n'ai pas trouvé le bon encode/decode.
Rappel : Mon anglais est lamentable !

A partir d'un clavier virtuel :
http://www.lexilogos.com/clavier/araby.htm
Je saisis un texte, copier/coller dans un fichier .txt dans KWrite.
Je sauvegarde avec encodage cp1256.
Lorsque j'ouvre le fichier, je vois des chaine translittérée comme dans $texte1 ci-dessus:

ßóÊóÈó
ßóÊóÈó ÇßóÇÊöÈõ

===============

Voici un bout de code :
http://cjoint.com/?0cqi5jPHoRK

===============

J'ai essayé plusieurs encodages dont cp1256 iso8859-6 UnicodeUtf16
Pour le moment les meilleurs résultats sont avec cp1256
Sauf que :
- Sous Linux les caractères apparaissent sous la forme isolée (pas bon du tout)
- Sous XP les mots sont correctement formés mais ils apparaissent en désordre comme si l'arabe était lu de gauche à droite...

===============
Un autre bout de code
http://cjoint.com/?0cqi8czNYKk

Avec ce deuxième pgm c'est pire sous Linux. Sous XP pas essayé pour l'instant !

================

Voila, pardon d'avoir été aussi long.
En résumé, l'arabe s'écrit de gauche à droite, les caractères changent de forme suivant leurs place dans le mot.
Le fichier MonTxtArabCP1256.txt contient 2 lignes :
1 = Il a écrit
2 = L'écrivain a écrit
A l'écran, je dois afficher :

??????
?????? ????????

D'avance MERCI lami20j.
MERCI à tout le monde.
Si le Maghreb pouvait venir à mon secours ça serait SUPER !

Un petit essai, lisible avec Widows Media, les autres lecteurs je ne sais pas...
http://dmspin.free.fr/Sybawayh_Vocab_1_A_7.wmv

Et çà, c'est pour mieux me cerner :-))
http://spinoza.texte.free.fr/Ethique.php
dmganges- 16 févr. 2011 à 06:57
Ben les deux phrases en arabe n'apparaissent pas non plus sous CCM
il faut se contenter de l'encodage iso-8859-1
ßóÊóÈó
ßóÊóÈó ÇßóÇÊöÈõ

Mais là déjà les mots sont inversés dans la 2ème phrase, si on lit l'encodage de droite à gauche...
lami20j- 16 févr. 2011 à 07:40
Salut,

Ce que j'avais besoin c'était le fichier .txt qui contient ton texte initial.
Compresse le et mets le sur cjoint.com ou envoye le par mail (voir mon profil).
Je ne peux regarder que très tard le soir ou dans l'week-end.

Lorsque je visualise le contenu du fichier avec KWrite, et si je choisi dans [encodage] : Unicode (uft16) , je vois bien le texte en arabe.
Fait un imprimé écran et envoie aussi l'image.
Ca me permettra de voir ce que tu vois.

Rappel : Mon anglais est lamentable !
Mon arabe est zéro ;-)
dmganges- 16 févr. 2011 à 08:45
Bjr,
cp1256 :
http://cjoint.com/?0cqiwZoddGN

iso-8859-1 :
http://cjoint.com/?0cqiA6FpQLT

Tu vas voir la même chose !

Le pb, lorsque j'ouvre Le-cp1256 sous KWrite il me faut repasser en cp1256 pour voir les caractères arabes.

Sinon au pire tu vas sur :
http://fr.wikipedia.org/wiki/Langue_arabe

Dans le pavé de droite en bas il y a un échantillon, tu fais un copier/coller dans un ficher...
tu regardes, tu essayes de sauvegarder... Enfin c'est pas la joie...
http://cjoint.com/?0cqiHhHnuoz

Moi dès que j'enregistre :
- si je suis en iso-8859-1(5) européen, il me dit que ça ne sera pas sauvegardé en totalité,
- donc je passe en encodage cp1256, là il sauvegarde
- lorsque je veux voir les caractères en arabe, j'ouvre en iso-8859-1 sous KWrite, et je rebascule en cp1256 et là, miracle c'est OK

Prends ton temps, ce n'est pas une appli opérationnelle, c'est juste une lubie de retraité !
:-))


Ce que je vois avant d'enregistrer :
http://cjoint.com/?0cqjhS45AqF
Ajouter un commentaire
Réponse
+0
moins plus
bonjour,

et en jouant avec les locales du système ?

commande : locale


à tout hasard ...
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Oui c'est une bonne piste !!
Sur XP j'ai créé un utilisateur spécifique avec un environnement arabe le plus complet possible : prise en compte des polices qui s'écrivent de droite à gauche, ajout d'un clavier arabe.
Là j'obtiens quelque chose de correct, c'est juste un extrait, avec :

http://cjoint.com/?0crghYPQCP

Pour ce que je dois afficher, je peux me contenter de çà !
La manip se résume à : sous XP, saisir un texte dans un fichier dans l'environnement arabe, reprendre ce fichier sous Linux pour en sauvegarder un encodage 8859-1, revenir sous XP pour faire l'affichage dans l'appli.

Pb, pour le moment je n'ai pas réussi à trouver des locales compatibles sous Linux... Donc l'appli ne fonctionnerait que sous XP, ce n'est pas la mort :-)))

Sauf que j'ai la possibilité sous linux de faire jouer un mp3 sans afficher de fenêtre avec la commande artsplay, et que je ne trouve pas l'équivalent en XP !

Autrement dit j'ai le son qui tourne bien en Linux, et l'affichage sous XP, mais pas les deux ensembles :-)))

En XP, j'ai bien essayé :
C:\windows\SNDREC32.EXE /PLAY /CLOSE C:\Documents and Settings\Michel\Mes documents\Ma musique\
Mais çà ne joue que du .wav et j'aimerai bien rester en .mp3

Si je l'adapte pour Windows Media, la fenêtre s'ouvre quand même...

Donc pour aujourd'hui, je suis à la recherche d'une appli Windows capable de jouer un son .mp3 sans ouvrir de fenêtre pour faire ce qui fonctionne sous Linux :

my @liste = ("artsplay $repertoire/$nom");
system @liste;

Si tu as çà je suis preneur, sinon j'ouvre une autre question CCM.

Encore MERCI, et bonne journée !
dmganges- 20 févr. 2011 à 12:37
OUI çà c'est super ?
Je donne ma langue au chat !
lami20j- 20 févr. 2011 à 12:58
Voici le code

lami20j@debian-acer:~$ cat dmganges_encodage_arabe2.pl  
#!/usr/bin/perl -w 
use Tk; 
use strict; 
use utf8; 

my ($mw, $test_string, $txt); 
$mw = MainWindow->new(-title => "UTF-8 dmganges arabe Test", -width=>400, -height=>30 
  +0); 
$test_string = "?????? ????????"; 
$txt = $mw->Text(-height=>5)->pack; 
$txt->insert('end', $test_string); 
MainLoop;


P.S. Bien sûr, au lieu de ?????? tu mettras ton texte en arabe
dmganges- 20 févr. 2011 à 13:54
Non, je dois être bourrin !

http://cjoint.com/?0cunRCDFlC6

Toujours non liés chez moi !
En plus chez moi on voit que les mots sont inversés.

lami20j.pl et dmganges_encodage_arabe2.pl sont enregistrés utf8...
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,
Je reviens donner quelques nouvelles :-)

Pour écrire en arabe dans des widgets Perl/Tk, il faut lui passer des chaînes codées en cp1256.
On obtient ceci :

http://cjoint.com/?1dktkLwmDZ4

Ce qui me convient parfaitement.

Un seul souci, pour générer des chaînes cp1256, c'est un véritable calvaire, je fais une usine à gaz :
- Sous XP avec NotePad j'enregistre un fichier en 'unicode' qui contient le texte arabe.
- Je passe sous Linux, avec Kwrite paramétré en 'unicode' j'ouvre le fichier, je fais un Copier. J'ouvre un fichier vierge sous Kwrite paramétré en 'cp1256', je fais un Coller et j'enregistre.
- Je repasse sous XP pour faire tourner ma petite appli, qui lit parfaitement le fichier encodé en cp1256.

Voici le contenu d'un fichier codé en cp1256 :
1
ÃóáÏøóÑúÓõ ÇáÃóúæøóáõ
ßóÊóÈó
ßóÊóÈó ÇáúßóÇÊöÈõ

Et j'insiste, qui s'affiche parfaitement.

A partir de là, il me semblait qu'un decode encode devrait suffire.
J'ai donc fais ceci :

#use encoding 'cp1256';
use Encode qw(encode decode);

$IN_Fic = "tata.unicode";
$OUT_Fic = "tutu.cp1256";

unless (open (IN,"<".$IN_Fic)) {
$t->insert("end", "ERREUR : Impossible d'ouvrir $IN_Fic\n");
return;
}

unless (open (OUT,">".$OUT_Fic)) {
$t->insert("end", "ERREUR : Impossible d'ouvrir $OUT_Fic\n");
return;
}

while ($LigIN = <IN>) {

print "$LigIN\n";

print OUT decode 'unicode', encode 'cp1256', $LigIN;
# print OUT $LigIN;

}

close $IN_Fic;
close $OUT_Fic;


Et voici ce que j'obtiens :
??1

#ND/QN1R3O 'D#NRHQNDO

CN*N(N

CN*N(N 'DRCN'*P(O


J'ai bien sûr essayé moult encode/decode,
et toutes les combinaisons du pakage ArabTex :
http://search.cpan.org/dist/Encode-Arabic/lib/Encode/Arabic.pm

Exemple :
#while ($line = <>) { # renders the ArabTeX notation for Arabic both in the ..
#
# print encode 'utf8', decode 'arabtex', $line; # .. Arabic script proper and the
# print encode 'utf8', decode 'arabtex-zdmg', $line; # .. Latin phonetic transcription
# }

Voila, voila,
Si vous ne venez pas à mon secours, je continuerai mon usine à gaz.
Mais avouez qu'une petite moulinette encode/decode serait préférable !

http://cjoint.com/?1dktkLwmDZ4
Représente la petite appli qui consiste à "jouer" le cours Assimil, les phrases avec ou sans la prononciation, en faisant varier les temporisations, la taille des caractères arabes, répétition d'une plage de cours...

Pour des problèmes de droits, je ne peux pas mettre en ligne ces cours.
mais voici le code source de l'appli :
http://cjoint.com/?1dktRZ9N6cs
Ce n'est pas un modèle du genre, mais çà peut servir.

Je peux bien sûr donner toutes les explications pour le découpage du son et la création des fichiers en arabe...
:-)
dmganges- 26 mars 2011 à 13:32
Une démo Youtube d'un texte arabe en Perl Tk :
http://www.youtube.com/user/mdg34190?feature=mhum
dmganges- 27 mars 2011 à 08:04
Bon j'ai résolu le encode/decode :

Pour un texte écrit avec NotePad, il faut :
1 - le sauvegarder en utf8
2 - après le encode/decode qui le passe en cp1256, il faut avoir soin de supprimer le premier caractère de la chaine (en fait fin de chaine arabe) et qui est codé 'EF', ce qui donne en résumé :

use Encode qw(encode decode);
...
while ($LigIN = <IN>) {
$LigIN = encode 'cp1256', decode 'utf8', $LigIN;
my $ch = substr ($LigIN,1);
print OUT $ch;
}
Ajouter un commentaire
Ce document intitulé « Perl Tk encodage arabe » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?