web-dev-qa-db-fra.com

Comment puis-je sortir UTF-8 de Perl?

J'essaie d'écrire un script Perl en utilisant le pragma "utf8" 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 configurés par défaut pour écrire des fichiers au format utf-8.

Cependant, lorsque je saisis ce qui suit dans un fichier texte, que je l’enregistre en tant que ".pl", et que je l’exécute, le "diamant avec un point d’interrogation" apparaît à 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 des "Çirçös" dans la sortie, mais des "getir��s" à la place.

103
Peter Conrey

use utf8; N'active pas Unicode sortie - il vous permet de taper Unicode dans votre programme. Ajoutez ceci au programme, avant votre instruction print():

binmode(STDOUT, ":utf8");

Voyez si cela aide. Cela devrait donner STDOUT une sortie en UTF-8 au lieu d’ASCII ordinaire.

153
Chris Lutz

Vous pouvez utiliser le open pragma .

Pour par exemple. ci-dessous définit STDOUT, STDIN & STDERR pour l’utilisation de UTF-8 ....

use open qw/:std :utf8/;
82
draegtun

TMTOWTDI , choisissez la méthode qui convient le mieux à votre façon de travailler. J'utilise la méthode d'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";
64
Chas. Owens

Vous voulez également dire que les chaînes de votre code sont en utf-8. Voir Pourquoi Perl moderne évite-t-il UTF-8 par défaut? . Donc, non seulement Perl_UNICODE=SDAL mais aussi Perl5OPT=-Mutf8.

1
Hans Ginzel

Merci, enfin obtenu une solution pour ne pas mettre utf8 :: encode sur tout le code. Pour synthétiser et compléter d'autres cas, comme écrire et lire des fichiers dans utf8 et fonctionne également avec LoadFile d'un fichier YAML dans 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ù cache.yaml est:

---
2917:
  id: 2917
  name: Semanário
  primary_uri: 2917.xml
0
Sérgio