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

Fermé
Eno145 Messages postés 8 Date d'inscription samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022 - 1 mai 2022 à 12:32
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 - 3 mai 2022 à 20:27
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

1 réponse

[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
1 mai 2022 à 17:11
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 samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022 1
1 mai 2022 à 20:15
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 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > Eno145 Messages postés 8 Date d'inscription samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022
1 mai 2022 à 22:27
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 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > Eno145 Messages postés 8 Date d'inscription samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022
Modifié le 2 mai 2022 à 19:50
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 samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022 1 > [Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024
3 mai 2022 à 10:53
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 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083 > Eno145 Messages postés 8 Date d'inscription samedi 26 février 2022 Statut Membre Dernière intervention 3 mai 2022
3 mai 2022 à 20:27
Bravo !
1