Perl débutant: lire des caractères chinois sur l'invit

Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je souhaite créer un script Perl pour apprendre les caractères chinois. Pour cela, il me faut évidemment savoir déjà imprimer les caractères correctement sur la console. J'ai déjà installé des modules comme Encode::Han Extra et aussi Encode et testé les codes déjà trouvés sur différents sites web. Malheureusement quand je print le résultat, j'ai soit un caractère illisible sur l'invit de commande soit un message d'erreur. Je travaille avec Strawberry Perl 5.32 et je suis sous Windows 10.Voici le dernier code que j'ai testé.

use strict;
use warnings;
use utf8;
use Encode qw (encode decode);

my $chinese = "你好";
my $content = encode ("utf-8",decode("gb2312", $chinese));

print "$content\n";

sur la console:

C:\Perl ex>perl chinois.pl
Wide character at chinois.pl line 7.

Merci beaucoup
Configuration: Windows / Firefox 99.0
A voir également:

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Eno145,

Le contenu de $chinese n'est-il pas déjà en utf8 ?

Quel est l'encodage de ton fichier Perl ?

Dal
0
Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour,

J'ai configuré sur Atom mon fichier Perl en utf8 (comme d'habitude). En toute logique, je pensais que le caractère pourrait être lu, vu que je le tape directement avec le clavier chinois de windows. Mais, avec le code basique:

use strict;
use warnings;
use utf8;

my $chinese = "你好";


print "$chinese\n";

la réponse sur l'invit me donne:

C:\Perl ex>perl chinese2.pl
Wide character in print at chinese2.pl line 8.
õ¢áÕÑ¢

Même en configurant directement le script en chinois simplifié, cela me donne des expressions illisibles.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105 > Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
OK, vu que ton code source est déjà en utf8, le contenu de $chinese est déjà en utf8 et tu n'as rien à décoder.

Pour afficher le contenu sur la console Windows, essaye ceci :

use strict;
use warnings;

use utf8; 

use Encode qw(encode);
use Encode::HanExtra;

my $chinese = "你好"; 

print encode('GB18030', $chinese);


Si tu n'as pas le module Encode::HanExtra, installe le.
1
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105 > Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Je suis sous Linux et je peux difficilement tester.

Ton terminal CDM est-il paramétré avec un code-page compatible avec cet affichage ?

https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
https://docs.microsoft.com/fr-fr/windows-server/administration/windows-commands/chcp

essaye de lancer :

chcp 54936
dans la console avant de lancer ton script (qui correspond à GB18030)

Tu peux essayer d'autres combinaisons de code page et d'encodage. Il y en a plusieurs pour le chinois. Il faut que les deux soient compatibles (ce que la console est prévue pour afficher et l'encodage des caractères que Perl envoie à la console que tu peux forcer avec encode).

Tu pourrais aussi utiliser la code-page 65001 pour utf-8 et juste tenter d'afficher directement ta variable déjà encodée en utf-8 que tu n'aurais pas à passer par encode à ce moment là.
1
Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   1 > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
Waouw merci énormément! Après plusieurs essais, c'est le chcp 936 qui a fonctionné:

936 gb2312 ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312).

Bonne journée.
1
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105 > Eno145 Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Bravo !
1