wake-up-neo.net

Wie kann ich UTF-8 von Perl ausgeben?

Ich versuche, ein Perl-Skript mit dem Pragma "utf8" zu schreiben, und erhalte unerwartete Ergebnisse. Ich verwende Mac OS X 10.5 (Leopard) und bearbeite mit TextMate. Alle meine Einstellungen für Editor und Betriebssystem sind standardmäßig auf das Schreiben von Dateien im utf-8-Format eingestellt.

Wenn ich jedoch Folgendes in eine Textdatei eingebe, sie als ".pl" speichere und ausführe, wird anstelle der Nicht-ASCII-Zeichen die angezeigte "Raute mit einem Fragezeichen" angezeigt.

#!/usr/bin/env Perl -w

use strict;
use utf8;

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

Irgendeine Idee, was ich falsch mache? Ich erwarte, "Çirçös" in der Ausgabe zu erhalten, aber ich erhalte stattdessen "�ir�s".

103
Peter Conrey

use utf8; Aktiviert Unicode nicht Ausgabe - Sie können Unicode in Ihr Programm eingeben. Fügen Sie dies vor Ihrer print() -Anweisung zum Programm hinzu:

binmode(STDOUT, ":utf8");

Mal sehen, ob das hilft. Das sollte STDOUT in UTF-8 anstelle von normalem ASCII ausgeben.

153
Chris Lutz

Sie können das offenes Pragma verwenden.

Zum Beispiel. Im Folgenden werden STDOUT, STDIN und STDERR für die Verwendung von UTF-8 festgelegt.

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

TMTOWTDI , wählte die Methode, die am besten zu Ihrer Arbeitsweise passt. Ich benutze die Umgebungsmethode, damit ich nicht darüber nachdenken muss.

In der mgebung :

export Perl_UNICODE=SDL

in der Befehlszeile :

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

oder mit binmode :

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

oder mit 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";

oder mit dem offenes Pragma :

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
64
Chas. Owens

Sie möchten auch sagen, dass Zeichenfolgen in Ihrem Code utf-8 sind. Siehe Warum vermeidet modernes Perl standardmäßig UTF-8? . Also setze nicht nur Perl_UNICODE=SDAL aber auch Perl5OPT=-Mutf8.

1
Hans Ginzel

Danke, habe endlich eine Lösung gefunden, um utf8 :: encode nicht komplett über den Code zu ziehen. Zu synthetisieren und für andere Fälle zu vervollständigen, wie das Schreiben und Lesen von Dateien in utf8 und funktioniert auch mit LoadFile einer YAML-Datei in 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}." ";

dabei ist cache.yaml:

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