Perl Tk encodage arabe [Résolu/Fermé]

Signaler
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
-
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
-
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

7 réponses

Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
Aller un petit UP, car ce n'est pas évident !
MERCI
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Salut,

Si le fichier n'est pas confidentiel tu peux le mettre sur cjoint.
Je vais regarder plus tard.
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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.
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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 :
https://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 :
https://metacpan.org/pod/distribution/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 :
https://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 :
https://www.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
https://www.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
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
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 ;-)
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
Bjr,
cp1256 :
https://www.cjoint.com/?0cqiwZoddGN

iso-8859-1 :
https://www.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 :
https://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...
https://www.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 :
https://www.cjoint.com/?0cqjhS45AqF
Messages postés
8158
Date d'inscription
samedi 7 août 2004
Statut
Membre
Dernière intervention
1 septembre 2014
469
bonjour,

et en jouant avec les locales du système ?

commande : locale


à tout hasard ...
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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 :

https://www.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 !
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
Bonjour,
et MERCI pour le test !
J'en suis à peu près au même niveau.

Dans ton test tu remarqueras que dans la chaine $text4 certains caractères se sont liés automatiquement, ce qui est normal. Hors dans le menu déroulant les caractères apparaissent TOUS disjoints.

J'ai créé un utilisateur avec les locales initialisées pour l'arabe comme suggéré par bob031.
Ça ne change pas grand chose hors mis que j'ai une icône dans la barre qui me permet de basculer instantanément Fançais/Arabe. Ce qui est un PLUS !

Regarde le résultat ici https://www.cjoint.com/?0cujDiLdkJk

C'est un mot de 3 caractères : ka ta ba (il à écrit).
Dans Ooo et Kwrite les caractères sont biens lés.
Dans une console, comme dans un Label Tk, ils ne le sont plus...

En parcourant le web, j'avais trouvé une info qui précisait qu'il ne suffisait pas pour une application qu'elle puisse afficher des caractères arabes, encore fallait-il que l'application "sache" les liés. Je n'arrive pas à remettre la main sur le site.
Il semble que ce soit le cas dans nos manip : Ooo, Write "savent" Tk et Console, non !

Mais il doit y avoir un moyen...

Pour le moment j'abandonne l'idée de faire apparaitre le texte dans un Label Tk.

Je suis passé sous XP.
Là toutes les applis (Word, NotePad, Console, Ultraedit...) font le chainage des caractères.
Donc je ferai apparaitre le texte dans NotePad...

Voici un premier jet : https://www.cjoint.com/?0cuj55yzfdE

Ça rend plutôt bien.

La seule chose qui me manque c'est d'ouvrir NotePad en fenêtre plein écran.
A la mimine c'est OK, une fois maximisé, NotePad s'ouvre toujours en Max.

En ligne de commande, à ce niveau :
Win32::Process::Create(my $ProcessObj,
"C:\\WINDOWS\\system32\\notepad.exe",
"notepad $repertoire/$NomFic[0].txt",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();


c'est autre chose... je n'ai pas trouvé l'argument, dans le registre non plus, mais je persiste...

A TOUS et TOUTES, je suis preneur, là aussi, de la moindre piste...

Encore MERCI à lami20j et bob031
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Re,

Et ça, c'est lié ?
http://cjoint.com/data/0cukE5e7pWB.htm
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
OUI çà c'est super ?
Je donne ma langue au chat !
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
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
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
Non, je dois être bourrin !

https://www.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...
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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 :

https://www.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 :
https://metacpan.org/pod/distribution/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 !

https://www.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 :
https://www.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...
:-)
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
Une démo Youtube d'un texte arabe en Perl Tk :
http://www.youtube.com/user/mdg34190?feature=mhum
Messages postés
150
Date d'inscription
mercredi 29 octobre 2008
Statut
Membre
Dernière intervention
25 novembre 2013
19
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;
}