130 votes

Comment puis-je sortir UTF-8 de Perl ?

J'essaie d'écrire un script en Perl en utilisant la fonction utf8 pragma, et j'obtiens des résultats inattendus. J'utilise Mac OS X 10.5 (Leopard), et j'édite avec TextMate. Tous les paramètres de mon éditeur et de mon système d'exploitation sont définis par défaut pour écrire des fichiers au format utf-8.

Toutefois, lorsque je saisis le texte suivant dans un fichier texte, que je l'enregistre en tant que ".pl" et que je l'exécute, j'obtiens le sympathique "diamant avec un point d'interrogation" à la place des caractères non ASCII.

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = 'Çirçös';
print( "$str\n" );

Une idée de ce que je fais mal ? Je m'attends à obtenir 'Çirçös' dans le résultat, mais j'obtiens 'irs' à la place.

176voto

Chris Lutz Points 34157

use utf8; n'active pas Unicode sortie - il vous permet de saisir l'Unicode dans votre programme. Ajoutez ceci au programme, avant votre print() déclaration :

binmode(STDOUT, ":utf8");

Voyez si ça aide. Cela devrait faire STDOUT sortie en UTF-8 au lieu de l'ASCII ordinaire.

89voto

draegtun Points 17081

Vous pouvez utiliser le pragma ouvert .

Par exemple, l'exemple ci-dessous définit STDOUT, STDIN et STDERR pour utiliser UTF-8.....

use open qw/:std :utf8/;

78voto

Chas. Owens Points 40887

TMTOWTDI choisissez la méthode qui correspond le mieux à votre façon de travailler. J'utilise la méthode de l'environnement pour ne pas avoir à y penser.

Dans le environnement :

export PERL_UNICODE=SDL

sur le ligne de commande :

perl -CSDL -le 'print "\x{1815}"';

ou avec binmode :

binmode(STDOUT, ":utf8");          #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8

ou avec PerlIO :

open my $fh, ">:utf8", $filename
    or die "could not open $filename: $!\n";

open my $fh, "<:encoding(utf-8)", $filename
    or die "could not open $filename: $!\n";

ou avec le pragma ouvert :

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";

2voto

Hans Ginzel Points 24

Vous voulez aussi dire que les chaînes de caractères dans votre code sont utf-8. Voir Pourquoi Perl moderne évite-t-il UTF-8 par défaut ? . Ainsi, non seulement PERL_UNICODE=SDAL mais aussi PERL5OPT=-Mutf8 .

1voto

Sérgio Points 854

Merci, j'ai enfin trouvé une solution pour ne pas mettre utf8::encode partout dans le code. A synthétiser et à compléter pour d'autres cas, comme écrire et lire des fichiers en utf8 et fonctionne aussi avec LoadFile d'un fichier YAML en utf8

use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");

open(FH, ">test.txt"); 
print FH "something éá";

use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";

où se trouve cache.yaml :

---
2917:
  id: 2917
  name: Semanário
  primary_uri: 2917.xml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X