135 Stimmen

Wie kann ich UTF-8 von Perl aus ausgeben?

Ich versuche, ein Perl-Skript zu schreiben, das die utf8 pragma, und ich erhalte unerwartete Ergebnisse. Ich verwende Mac OS X 10.5 (Leopard) und bearbeite den Text mit TextMate. Alle meine Einstellungen sowohl für meinen Editor als auch für mein Betriebssystem sind standardmäßig auf das Schreiben von Dateien im utf-8-Format eingestellt.

Wenn ich jedoch den folgenden Text in eine Textdatei eingebe, ihn als ".pl" speichere und ausführe, erhalte ich anstelle der Nicht-ASCII-Zeichen die freundliche "Raute mit Fragezeichen".

#!/usr/bin/env perl -w

use strict;
use utf8;

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

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

185voto

Chris Lutz Punkte 69879

use utf8; aktiviert Unicode nicht Ausgabe - ermöglicht es Ihnen, in Ihrem Programm Unicode einzugeben. Fügen Sie dies in das Programm ein, bevor Sie print() Erklärung:

binmode(STDOUT, ":utf8");

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

91voto

draegtun Punkte 22205

Sie können die offenes Pragma .

Im Folgenden wird z. B. festgelegt, dass STDOUT, STDIN und STDERR UTF-8.... verwenden.

use open qw/:std :utf8/;

82voto

Chas. Owens Punkte 62716

TMTOWTDI Wählen Sie die Methode, die am besten zu Ihrer Arbeitsweise passt. Ich verwende die Umweltmethode, damit ich nicht darüber nachdenken muss.

In der Umwelt :

export PERL_UNICODE=SDL

über die Kommandozeile :

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

2voto

Hans Ginzel Punkte 6714

Sie möchten auch angeben, dass Strings in Ihrem Code utf-8 sind. Siehe Warum vermeidet das moderne Perl standardmäßig UTF-8? . So setzen Sie nicht nur PERL_UNICODE=SDAL sondern auch PERL5OPT=-Mutf8 .

1voto

Sérgio Punkte 6518

Danke, endlich eine Lösung, um nicht utf8::encode alle über Code setzen. Zu synthetisieren und vollständig für andere Fälle, wie Schreiben und Lesen von Dateien in utf8 und arbeitet 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}." ";

wo cache.yaml ist:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X